実現したいこと
以下のようなデータがあります。
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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/05/01 09:12
2023/05/01 09:17
2023/05/01 09:27
2023/05/01 09:51
2023/05/02 01:16