我有一个设计选择很差的数据框,如下所示:
df = pd.DataFrame({
'Day': ['2021-03-01', '2021-03-01', '2021-03-02', '2021-03-02', '2021-03-03'],
'Name': ['Sam', 'Sam', 'Jack', 'Steve', 'Steve'],
'Fruit':['Apple', 'Apple', 'Banana', 'Apple', 'Banana'],
'2021-03-01':['2', '1', '0', '1', '1'],
'2021-03-02': ['3', '5', '4', '2', '1'],
'2021-03-03':['7', '3', '2', '1', '4']})
df
Day Name Fruit 2021-03-01 2021-03-02 2021-03-03
0 2021-03-01 Sam Apple 2 3 7
1 2021-03-01 Sam Apple 1 5 3
2 2021-03-02 Jack Banana 0 4 2
3 2021-03-02 Steve Apple 1 2 1
4 2021-03-03 Steve Banana 1 1 4
我想要,对于 Day
中的每个日期, 对应于列名与 Day
的值相同的列中的日期,将其他变量分组并按总和聚合它们。例如,如果
Day
值为“2021-03-01”,然后在“2021-03-01”列中,我将对值求和(该列中苹果的 nr 和香蕉的 nbr)。它希望结果数据框看起来像这样:
Date Name nrApples nrBananas
0 2021-03-01 Sam 3 0
1 2021-03-02 Jack 0 4
2 2021-03-02 Steve 2 0
3 2021-03-03 Steve 0 4
问题是我有很多这样的日期列,我不知道如何检查Day
中的值是否存在columns 与列的名称相同,并聚合它的值。谢谢你的帮助。
最佳答案
融化列,比较Day
列到 variable
包含 Days、groupby、aggregate(sum)、unstack 和 reset 索引的列:
(df
.melt(['Day', 'Name', 'Fruit'])
.loc[lambda df: df.Day.eq(df.variable)]
.astype({"value": int})
.groupby(['Day', 'Name', 'Fruit'])['value']
.sum()
.unstack(fill_value = 0)
.add_prefix("nr")
.reset_index()
.rename_axis(columns = None)
)
Fruit Day Name nrApple nrBanana
0 2021-03-01 Sam 3 0
1 2021-03-02 Jack 0 4
2 2021-03-02 Steve 2 0
3 2021-03-03 Steve 0 4
关于python - 按日期和总和列分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66960847/