DataFrame:
df = pd.DataFrame([['CategoryA', 400], ['CategoryA', 600],
['CategoryB', 1000], ['CategoryB', 2000]],
columns = ['Category', 'ItemTotal'])
我使用以下方法为按类别的总金额创建了分组依据:
df = df.groupby('Category')
df = df['ItemTotal'].sum()
df
输出看起来像这样:
Category
CategoryA 1000
CategoryB 3000
我希望最终获得除每个类别的份额总和之外的另一列,如下所示:
Category
CategoryA 1000 .25
CategoryB 3000 .75
我想知道如何通过将累积的美元金额插入新列,然后通过除法创建一个新的份额列来做到这一点。
@jezrael提供的链接How do I create a new column from the output of pandas groupby().sum()?返回原始数据帧中每一行旁边的每个类别的总和:
df['Total'] = df['ItemTotal'].groupby(df['Category']).transform('sum')
df
输出:
Category ItemTotal Total
0 CategoryA 400 1000
1 CategoryA 600 1000
2 CategoryB 1000 3000
3 CategoryB 2000 3000
但是,我要查找的是每个类别的总和以及已分组的每个唯一类别旁边的总数的份额,而不是原始数据框中的每一行。
答案 0 :(得分:1)
首先需要将index
转换为列:
df1 = df.groupby('Category', as_index=False)['ItemTotal'].sum()
或者:
df1 = df.groupby('Category')['ItemTotal'].sum().reset_index()
如果需要将Series
转换为一列DataFrame
:
df1 = df.groupby('Category')['ItemTotal'].sum().to_frame()
最后一列的sum
:
df1['Perc'] = df1['ItemTotal'].div(df1['ItemTotal'].sum())
print (df1)
Category ItemTotal Perc
0 CategoryA 1000 0.25
1 CategoryB 3000 0.75