Pandas DataFrameを使った表の作成。まったく違った表からの作成。または、Dataframeの任意の位置の値の更新を変数を使って。

実現したいこと

以下のようなデータがあります。

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 コメント