我有一个数据框,我想groupby
几个条件,然后求和几个字段。当我对值求和时,我想将值展平
输入以下内容:
UserID Site First Name Last Name May Hours June Hours July Hours
6385 A John Doe 8 9 10
6385 A John Doe 3 7 8
4756 A Mark Mean 7 6 5
4756 B Mark Mean 3 2 3
并按UserID
和Site
分组,我想要的输出是:
UserID Site First Name Last Name May Hours June Hours July Hours
6385 A John Doe 11 16 18
4756 A Mark Mean 7 6 5
4756 B Mark Mean 3 2 3
可以假定除了UserID,网站和“每月小时数”之外,所有其他列的值都相同。
我目前的想法是:
for group_name, group_df in df.groupby(by=['UserID','Site']):
if len(group_df) > 1: # We have rows that need to be summed
sums = group_df[['May Hours','June Hours','July Hours']].sum()
# Assign this sum to the first row in the grouped_df
# Remove all following rows in grouped_df (we already got their sum)
# Append this to a new dataframe
else:
# Append this to a new dataframe
虽然此解决方案可能有效,但肯定效率不高,但我不确定展平数据框的最佳方法
答案 0 :(得分:1)
遇到这种情况时,我经常会先旋转和展平数据框。几个关键原因是它将内容保留在数据框中,并允许我使用索引来处理诸如连接之类的内容。不过,没有什么反对groupby
,只喜欢pivot_table
。
df = pd.pivot_table(
index=df.columns[:4],
values=df.columns[4:],
aggfunc=np.sum
)
df = pd.DataFrame(df.to_records())