gpt4 book ai didi

python - 如何创建具有两种不同聚合的数据透视表

转载 作者:行者123 更新时间:2023-12-01 07:11:04 24 4
gpt4 key购买 nike

我有一个数据集,我想在其上运行多个聚合步骤。此代码创建数据:

import pandas as pd
import numpy as np

df1 = pd.DataFrame({'Name': ['A', 'A', 'B', 'B'],
'S': [200, 100, 300, 400],
'Date': pd.to_datetime(['2019-01-01', '2019-01-01', '2019-02-01', '2019-03-01']).date,
'Value': [5, 10, 30, 40]})

产量:

df1: 
Name S Date Value
0 A 200 2019-01-01 5
1 A 100 2019-01-01 10
2 B 300 2019-02-01 30
3 B 400 2019-03-01 40

聚合的最终结果应如下所示:

                2019-01-01  2019-02-01  2019-03-01
A 100, 200 15
B 300 - 400 30 40

我做的第一步是

df2 = df.groupby(by=['Name', 'Date']).agg({'S': lambda x: ', '
.join(pd.DataFrame([str(s) for s in x]).drop_duplicates()
.sort_values(by=0)
.iloc[:, 0]
.map(str)),
'Value': np.sum,})

.join(...) 部分有点复杂,但它获取 S 中的数字、删除重复项、排序并将它们连接到字符串。

结果是这样的:

df2: 
S Value
Name Date
A 2019-01-01 100, 200 15
B 2019-02-01 300 30
2019-03-01 400 40

现在我被困住了。我可以生成以下内容:

df3 = (df2.pivot_table('Value', index=['Name', 'S'], columns=['Date'], 
aggfunc={'Value': np.sum})
.fillna(0)
.reset_index()
)
df3: 
Date Name S 2019-01-01 2019-02-01 2019-03-01
0 A 100, 200 15.0 0.0 0.0
1 B 300 0.0 30.0 0.0
2 B 400 0.0 0.0 40.0

但是,我希望将最后两行合并起来,将 S 变为 300 - 400 (类似于 df2 的连接) )。我还没有找到如何将这些聚合合并为一个步骤(混合 groupbypivot_table)。

感谢您的帮助。

最佳答案

试试这个:

val=df1.groupby(['Name','Date'])['Value'].sum().reset_index() # get aggregate sum of values
ind=df1.groupby('Name').apply(lambda x: '-'.join([str(i) for i in x.S.values])).reset_index() # Prepare index for target dataframe
target_df=ind.merge(val, on=['Name']).pivot_table(index=['Name', 0], columns=['Date'], values='Value').fillna(0) # Merge both and pivot to get desired output

然后,print(target_df) 给出所需的输出:

Date          2019-01-01  2019-02-01  2019-03-01
Name 0
A 200-100 15.0 0.0 0.0
B 300-400 0.0 30.0 40.0

关于python - 如何创建具有两种不同聚合的数据透视表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58214917/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com