実現したいこと
以下のようなデータがあります。
Python
1# A, B, D1 - D3, val値2d = [3('AB', 'R1', 'D2', 3),4('AB', 'R1', 'D2', 5),5('AB', 'R2', 'D2', 10),6('CA', 'S2', 'D3', 20),7('TX', 'R1', 'D1', 30),8('CA', 'S1', 'D3', 21),9('TX', 'S1', 'D2', 33),10]
次のようなDataframeを作りたいと考えています。
(一覧表csvを出力したいため)
A | B | D1 | D2 | D3 | D3 |
---|---|---|---|---|---|
0 | AB | R1 | NaN | 8 | NaN |
1 | AB | R2 | NaN | 10 | NaN |
2 | CA | S1 | NaN | NaN | 21 |
3 | CA | S2 | NaN | NaN | 20 |
4 | TX | R1 | 30 | NaN | NaN |
5 | TX | S1 | NaN | 33 | NaN |
一致するA,Bの行に、指定されたD1 - D3にval値を入れる。
同じA,B,D1 - D3の場合は、val値を加算して加える。
(A&Bの重複はありません)
質問
質問1
目的達成のための手段(方針)
下記の試したやり方よりももっとスマートな方法がありますか?
質問2(質問1答次第では不要なのですが、その答えとは別に教えてください)
下記ソースの引用テキストindexをqueryで取得して、df[x][y]で代入しようとしている部分を
どう直したら動くのでしょうか?
2次元配列を使ってゴリゴリやればできると思いますが、
できましたらPandas(またはNumpy)を使って、
Pandas(またはNumpyらしい)スマートな
やり方で表を作りたいと考えております。
以上、よろしくお願い致します。
該当のソースコード
Python
1d = [2('AB', 'R1', 'D2', 3),3('AB', 'R1', 'D2', 5),4('AB', 'R2', 'D2', 10),5('CA', 'S2', 'D3', 20),6('TX', 'R1', 'D1', 30),7('CA', 'S1', 'D3', 21),8('TX', 'S1', 'D2', 33),9]10 11df = pd.DataFrame(d, columns = ['A', 'B', 'd_type', 'value'])12 13 14# 出力したい表の外枠を作ります15 16## A,Bの重複を取り除いて、すべての行を作ります17df2 = df[['A', 'B']]18df2 = df2.drop_duplicates(subset=['A', 'B'])19 20## df2にD1-D3列を追加21df2['D1'] = np.nan 22df2['D2'] = np.nan 23df2['D3'] = np.nan 24 25 26# indexをqueryで取得して、df[x][y]で代入しようと考えました27for a, b, d_type, value in d:28 print(a, b, d_type, value)29 30 idx = df2.query('a == @a').index[0]31 df2[f"{d_type}"][f"{idx}"] += value 32 33 34# 出来上がったdf2をcsvに出力35 (省略)
発生している問題・エラーメッセージ
上記ソースの引用テキストindexをqueryで取得して、df[x][y]で代入しようとしている部分が
Pandasをまだよく理解していないため、見当違いでエラーで動きません。
補足情報(FW/ツールのバージョンなど)
Python 3.11.2
pandas 1.5.3
0 コメント