我阅读了一系列的csv文件。每个都包含不同用户的交易数据的历史记录。我想按工作日汇总整个组的交易金额。为每个用户进行摘要很容易,但是在汇总结果时遇到了问题
对于每个用户,数据看起来像这样:
id data_import_id posted amount
00000000 3c221ff 2014-01-02T19:00:00.000-05:00 3656506
00000013 3c221ff 2014-01-02T19:00:00.000-05:00 3656506
00000015 3c221ff 2014-01-04T19:00:00.000-05:00 3656506
0000000a 3c221ff 2014-01-05T19:00:00.000-05:00 3656506
00000001 3c221ff 2014-01-06T19:00:00.000-05:00 3656506
我阅读了.csv文件,并为每个用户建立了一个数据框列表。然后,我处理数据框以首先按工作日获取金额摘要,然后尝试汇总所有用户的结果。
两个用户的累积数据框列表如下所示:
[ amount
weekday
Monday 43118
Wednesday 5872780, amount
weekday
Friday 1249
Monday 2566648
Wednesday 12000]
从该列表中,我想生成一个只有两列的单个数据框:“工作日”和“金额”,其中“金额”是所有用户一天的总计。
我在下面使用的代码给出了“ ValueError:无法将列数量转换为类型'int'的类型”。我也尝试过使用'append'和'join',但由于数据框的大小不尽相同,因此无法使其正常工作。 TIA提供任何帮助/指导。
def assess(df):
# Create list to hold results
cumulative = []
for frame in df:
# Produce a Dataframe that summarizes a users weekday totals
total_amounts = frame.groupby(["weekday"])[["amount"]].sum()
cumulative.append(total_amounts)
print(cumulative)
# *** The problem is here ***
cumulative.set_index("weekday").join(total_amounts.set_index("weekday"))
return cumulative
答案 0 :(得分:1)
这是使用concat
然后使用groupby
的一种方法
df=pd.concat(list_of_dfs,keys=np.arange(len(list_of_dfs)))
df['weekday']=df.posted.dt.day_name()
l=[y.sum() for x ,y in df.groupby([df.index.get_level_values(0),df.weekday])['amount']]
如果需要在数据框中添加它们
yourdf=df.groupby([df.index.get_level_values(0),df.weekday])['amount'].sum()
答案 1 :(得分:0)
您可以为此使用Series.dt.date_name
并将其传递给groupby函数:
df_new = df.groupby(df.posted.dt.day_name())['amount'].sum()
print(df_new)
posted
Monday 3656506
Saturday 3656506
Sunday 3656506
Thursday 7313012
Name: amount, dtype: int64