Python 按日期和总和列分组
我有一个dataframe,它的设计选择很差,如下所示:Python 按日期和总和列分组,python,pandas,numpy,Python,Pandas,Numpy,我有一个dataframe,它的设计选择很差,如下所示: 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'],
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
列中的值是否与列的名称相同,并聚合它的值。
谢谢你的帮助
def fn(x):
return (
x.set_index("Fruit")
.loc[:, x.Day.iat[0]]
.astype(int)
.groupby(level=0)
.sum()
.to_dict()
)
df = (
df.groupby(["Day", "Name"])
.apply(fn)
.apply(pd.Series)
.add_prefix("nr")
.reset_index()
.fillna(0)
)
print(df)
印刷品:
Day Name nrApple nrBanana
0 2021-03-01 Sam 3.0 0.0
1 2021-03-02 Jack 0.0 4.0
2 2021-03-02 Steve 2.0 0.0
3 2021-03-03 Steve 0.0 4.0
融化列,将
Day
列与变量
列进行比较,该列包含天数、分组依据、聚合(总和)、取消堆栈和重置索引:
(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
它工作得很好谢谢你!!如果我想对所有日期列求和,你知道我是否可以修改它吗?(无论
日期
是否相同)您都应该能够修改和。如果您有任何问题,请询问。