質問するログイン新規登録

Q&A

解決済

3回答

453閲覧

別のプログラムで動いていたコードを流用して書いたコードが正しく動きません

yyicp

総合スコア108

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

0クリップ

投稿2026/04/01 01:08

1

0

実現したいこと

こちらの関連質問です。

C.csvは以下のようなファイルです。

0 0 2 3 0

Cの、0でない要素値だけを取り出した行列をAとすると、A.csvは以下のようなファイルです。

2 3

Cの、要素値0である場所を示したファイルをB.csvとします。

0 1 4

今、AとBからCを復元したいと思っています。「該当のソースコード」ではエラーが出てしまいました。どなたか直してください。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "〇〇〇teratail.py", line 8, in <module> A.insert(B[i],str(i),0) ~~~~~~~~^^^^^^^^^^^^^^^ File "〇〇〇\pandas\core\frame.py", line 5182, in insert raise TypeError("loc must be int") TypeError: loc must be int

該当のソースコード

python

1import numpy as np 2import pandas as pd 3 4A = pd.read_csv("A.csv",header=None) 5B = pd.read_csv("B.csv",header=None) 6 7for i in range(len(B)): 8 A.insert(B[i],str(i),0) 9 10np.savetxt("C.csv", A, delimiter=",")

試したこと

詳細は書けませんが、別のプログラム中の以下のソースは正しく動きました。そのため、これを真似して「該当のソースコード」は書いたものですが、なぜか正しく動作しませんでした。AとBの型の問題かと予想しています。

python

1for i in range(len(col_idx)): 2 R3restore.insert(col_idx[i],str(i),0)
melian👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

jimbe

2026/04/01 18:08

>AとBの型の問題かと予想 予想して、どうされたのでしょう。 そこで思考停止されてしまわれたのでしょうか。 動いたという方の col_idx と R3restore はどのような型だったのでしょう。
yyicp

2026/04/02 01:14

>jimbe様 コメントありがとうございます。 melian様の回答にて解決しました。
guest

回答3

0

既に解決済みなので御参考です。

iter() 関数 を用いて A[0] からイテレータ(itr_a)を作ると, next() 関数 を用いて順番に要素を取り出すことができます。

記述例を下記に示します。

Python

1import pandas as pd 2 3A = pd.read_csv('A.csv', header=None) 4B = pd.read_csv('B.csv', header=None) 5 6itr_a = iter(A[0]) 7set_b = set(B[0]) 8l = len(A[0]) + len(B[0]) 9 10C = pd.DataFrame() 11C[0] = [0 if i in set_b else next(itr_a) for i in range(l)] 12print(C) 13# 0 14# 0 0 15# 1 0 16# 2 2 17# 3 3 18# 4 0 19 20C.to_csv('C.csv', header=False, index=False)

投稿2026/04/02 05:49

little_street

総合スコア563

yyicp

2026/04/02 06:16

できました。 どうもありがとうございました。
guest

0

Windows 11、Python 3.13.12で確認しました。
Numpyを使用せずに、もっとシンプルに書けます。

  1. A,Bをリスト化
  2. Aのリストに、Bのリストの値をインデックスにして、ゼロ挿入
  3. AのリストでDataFrameを作って、CSV出力

Python

1import pandas as pd 2 3A = pd.read_csv("A.csv",header=None) 4B = pd.read_csv("B.csv",header=None) 5 6# ここから下を変更 7l = A[0].tolist() 8 9for i in B[0].tolist(): 10 l.insert(i, 0) 11 12df = pd.DataFrame({0: l}) 13df.to_csv('C.csv', header = False, index = False)

投稿2026/04/01 09:26

hiroki-o

総合スコア1793

yyicp

2026/04/02 01:12

できました。 どうもありがとうございました。
guest

0

ベストアンサー

予め特定の要素数(A[0]の要素数+B[0]の要素数)を持つnumpy配列Cを作成します。次にデータフレームBで指定されていないインデックスの値をデータフレームAの値に入れ換えます。

python

1import numpy as np 2import pandas as pd 3 4A = pd.read_csv("A.csv",header=None) 5B = pd.read_csv("B.csv",header=None) 6 7C = np.zeros(A[0].size + B[0].size) 8C[~np.isin(range(C.size), B[0])] = A[0] 9 10np.savetxt("C.csv", C, delimiter=",", fmt="%g")

追記

以下は、上記と同じ処理をPandasで行う場合です。

python

1import numpy as np 2import pandas as pd 3 4A = pd.read_csv("A.csv",header=None) 5B = pd.read_csv("B.csv",header=None) 6 7C = pd.DataFrame(0, index=range(A[0].size + B[0].size), columns=[0]) 8C.loc[~C.index.isin(B[0]), 0] = A[0].to_numpy() 9 10np.savetxt("C.csv", C[0], delimiter=",", fmt="%g")

投稿2026/04/01 02:28

編集2026/04/01 12:34
melian

総合スコア21745

yyicp

2026/04/01 02:58

できました。 どうもありがとうございました。
yyicp

2026/04/02 01:09

追記の部分もできました。 どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問