使用特定条件在pandas数据框中创建求和摘要行

时间:2017-01-30 18:01:28

标签: python pandas dataframe aggregation

假设我有以下pandas数据框,我正在尝试发布处理结果以生成我的(现在为空白)摘要行:

    code    entry_type  value1  value2  value3  value4
1   A       Holding     1.1     1.2     1.3     1.4
2   A       Holding     2.1     2.2     2.3     2.4
3   B       Holding     3.1     3.2     3.3     3.4
4   C       Holding     4.1     4.2     4.3     4.4
5   C       Holding     5.1     5.2     5.3     5.4
6   A       Summary     nan     nan     nan     nan
7   C       Summary     nan     nan     nan     nan
8   B       Summary     nan     nan     nan     nan

基本上,我希望摘要行中的value1-value4是每个代码中所有权的总和:

    code    entry_type  value1  value2  value3  value4
1   A       Holding     1.1     1.2     1.3     1.4
2   A       Holding     2.1     2.2     2.3     2.4
3   B       Holding     3.1     3.2     3.3     3.4
4   C       Holding     4.1     4.2     4.3     4.4
5   C       Holding     5.1     5.2     5.3     5.4
6   A       Summary     3.2     3.4     3.6     3.8
7   C       Summary     9.2     9.4     9.6     9.8
8   B       Summary     3.1     3.2     3.3     3.4

我尝试了一些逐行代码,并提出了以下内容:

set = df[df['entry_type']=="Holding"].groupby('code')[['value1', 'value2', 'value3', 'value4']].sum()

哪个收益率:

        value1  value2  value3  value4
code
    A   3.2     3.4     3.6     3.8
    B   3.1     3.2     3.3     3.4
    C   9.2     9.4     9.6     9.8

但是我不确定如何将其应用回原始DataFrame,特别是由于代码顺序不一定与原始DataFrame相同。有关如何应用此问题的任何想法?还是更好的方法? (注意 - 其他列中的摘要行中存在大量其他数据,因此我无法生成内联新行。)

1 个答案:

答案 0 :(得分:4)

似乎concat可以提供帮助:

df1  = df[df['entry_type']=="Holding"]
         .groupby('code')[['value1', 'value2', 'value3', 'value4']].sum()
#print (df1)

#if need filter `df` for only rows with Holding use boolean indexing
print (pd.concat([df[df['entry_type']=="Holding"].set_index('code'), df1])
         .fillna({'entry_type':'Summary'})
         .reset_index())

  code entry_type  value1  value2  value3  value4
0    A    Holding     1.1     1.2     1.3     1.4
1    A    Holding     2.1     2.2     2.3     2.4
2    B    Holding     3.1     3.2     3.3     3.4
3    C    Holding     4.1     4.2     4.3     4.4
4    C    Holding     5.1     5.2     5.3     5.4
5    A    Summary     3.2     3.4     3.6     3.8
6    B    Summary     3.1     3.2     3.3     3.4
7    C    Summary     9.2     9.4     9.6     9.8

NaN的另一个可能解决方案,df1替换indexdf print (df.set_index('code') .combine_first(df1) .sort_values(['entry_type']) .reset_index()) code entry_type value1 value2 value3 value4 0 A Holding 1.1 1.2 1.3 1.4 1 A Holding 2.1 2.2 2.3 2.4 2 B Holding 3.1 3.2 3.3 3.4 3 C Holding 4.1 4.2 4.3 4.4 4 C Holding 5.1 5.2 5.3 5.4 5 A Summary 3.2 3.4 3.6 3.8 6 B Summary 3.1 3.2 3.3 3.4 7 C Summary 9.2 9.4 9.6 9.8 的{​​{1}}值对齐:

LostSalesUppdate =
SUMX (
VALUES ( Customer[CustomerName] ),
IF ( [SalesYTD] = 0 && [SalesPY] > 0, - [SalesPY] )
)