実現したいこと
以下の2つの処理をしたいと考えています。
質問(1)
Python Pandas Dataframeを使って、データ1を下記のような条件でデータ2のようにまとめたい(データ1→データ2)
- ID1とID2でグルーピングしたい
- 数字はsumしたい
- 文字列は結合したい(できれば「+」をつけたい)
- ただし、文字列が同じ場合は結合せず1つだけにする
さらに、可能なら
- ID2だけ文字列と同じ扱いにしたい。
- もしそれが困難な場合は、ID2は使わないので、sumしてしまってもよい
(蛇足な質問です。先に、数字でなく文字列(dataframeの型を文字に)にすれば良いかもしれませんが、Pandasの使い方として、列ごとに指定できるか知りたいと思います)
質問(2)
さらに、種類1、種類2でグルーピングし、そのさいにまとめた時の個数と値1、値2にそれぞれ個数をかけた合計値1、合計値値2を追加したい(データ2→データ3)
(グルーピング時に、種類2名、値1、値2は同じなので、そのまま)
以上、よろしくお願い致します。
データ1
ID1 | ID2 | 種類1 | 種類2 | 種類2名 | 値1 | 値2 |
---|---|---|---|---|---|---|
D001 | 1 | S02 | P001 | 丸 | 13 | 37 |
D001 | 1 | S03 | P001 | 丸 | 6 | 28 |
D001 | 1 | S05 | P001 | 丸 | 2 | 20 |
D001 | 2 | S02 | P002 | 三角 | 10 | 10 |
D001 | 2 | S05 | P002 | 三角 | 5 | 6 |
D001 | 3 | S02 | P003 | 四角 | 11 | 11 |
D002 | 1 | S02 | P004 | 線 | 15 | 12 |
D002 | 1 | S03 | P004 | 線 | 9 | 8 |
D003 | 1 | S02 | P002 | 三角 | 10 | 10 |
D003 | 1 | S06 | P002 | 三角 | 2 | 3 |
D003 | 2 | S02 | P002 | 三角 | 10 | 10 |
D003 | 2 | S05 | P002 | 三角 | 5 | 6 |
D003 | 3 | S01 | P005 | 丸 | 1 | 1 |
データ2
ID1 | ID2 | 種類1 | 種類2 | 種類2名 | 値1 | 値2 |
---|---|---|---|---|---|---|
D001 | 1 | S02+S03+S05 | P001 | 丸 | 21 | 85 |
D001 | 2 | S02+S05 | P002 | 三角 | 15 | 16 |
D001 | 3 | S02 | P003 | 四角 | 11 | 11 |
D002 | 1 | S02+S03 | P004 | 線 | 24 | 20 |
D003 | 1 | S02+S06 | P002 | 三角 | 12 | 13 |
D003 | 2 | S02+S05 | P002 | 三角 | 15 | 16 |
D003 | 3 | S01 | P006 | 丸 | 1 | 1 |
データ3
種類1 | 種類2 | 種類2名 | 値1 | 値2 | 個数 | 合計値1 | 合計値2 |
---|---|---|---|---|---|---|---|
S02+S03+S05 | P001 | 丸 | 21 | 85 | 1 | 21 | 85 |
S02+S05 | P002 | 三角 | 15 | 16 | 2 | 30 | 32 |
S02 | P003 | 四角 | 11 | 11 | 1 | 11 | 11 |
S02+S03 | P004 | 線 | 24 | 20 | 1 | 24 | 20 |
S02+S06 | P002 | 三角 | 12 | 13 | 1 | 12 | 13 |
S01 | P006 | 丸 | 1 | 1 | 1 | 1 | 1 |
該当のソースコード
質問(1)について
python
1# 本来はcsvを読み込んでいます。それにあわせるために、astype(int)しました。 2import pandas as pd 3 4df = pd.DataFrame([ 5['D001','1','S02','P001','丸','13','37'], 6['D001','1','S03','P001','丸','6','28'], 7['D001','1','S05','P001','丸','2','20'], 8['D001','2','S02','P002','三角','10','10'], 9['D001','2','S05','P002','三角','5','6'], 10['D001','3','S02','P003','四角','11','11'], 11['D002','1','S02','P004','線','15','12'], 12['D002','1','S03','P004','線','9','8'], 13['D003','1','S02','P002','三角','10','10'], 14['D003','1','S06','P002','三角','2','3'], 15['D003','2','S02','P002','三角','10','10'], 16['D003','2','S05','P002','三角','5','6'], 17['D003','3','S01','P005','丸','1','1'] 18], 19columns=['ID1','ID2','種類1','種類2','種類2名','値1','値2'], 20) 21 22df['ID2'] = df['ID2'].astype(int) 23df['値1'] = df['値1'].astype(int) 24df['値2'] = df['値2'].astype(int) 25 26dfg = df.groupby(['ID1','ID2']).sum() 27print(dfg)
発生している問題
質問(1)について
ID1 | ID2 | 種類1 | 種類2 | 種類2名 | 値1 | 値2 |
---|---|---|---|---|---|---|
D001 | 1 | S02S03S05 | P001P001P001 | 丸丸丸 | 21 | 85 |
sumだけですと、文字列も結合されてしまいます。
グルーピングのさい、同一の場合は、1つだけにしたいのですが、その方法が分かりません。
補足情報(FW/ツールのバージョンなど)
Python 3.12.1
pandas 2.1.4

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/03/16 06:19 編集
2024/03/16 07:04