繁体   English   中英

Python pandas - 在单独的列中聚合值

[英]Python pandas - Aggregate values in separate columns

我是 Python 的新手,我想知道是否有人可以帮助我完成以下任务。

我有以下 dataframe df 和以下列:

  • 主要 ID
  • 次要 ID
  • 实体类型
  • 价值

每个主要实体(实体类型:A)可能由一些次要实体(实体类型;X 或 Y)组成。 对于实体类型 A,主 ID 与辅助 ID 相同。 此外,每个主要实体和每个次要实体都有一个值。

在“次要 id X 值总和”和“次要 id Y 值总和”列中,我希望获得与每个主要实体相对应的次要实体(X 和 Y)的合计值。 聚合值应位于主要实体的行中。

所以,我最初的 df 是这样的:

主要 ID 次要 ID 实体类型 价值
0109 0109 一个 200
0109 A234 X 100
0109 A234 X 50
9996 9996 一个 400
9996 AAGT X 120
9996 AABG X 30
9996 0082 50
A765 A765 一个 50

我只想添加 2 列,而不更改初始 dataframe 的格式:

主要 ID 次要 ID 实体类型 价值 值总和 次要 id X 值总和 次要 id Y
0109 0109 一个 200 150 0
0109 A234 X 100 0 0
0109 A234 X 50 0 0
9996 9996 一个 400 150 50
9996 AAGT X 120 0 0
9996 AABG X 30 0 0
9996 0082 50 0 0
A765 A765 一个 50 0 0

谢谢!

尝试使用创建字典:

(df.groupby(['Primary ID', 'Entity type'])['Value']      
        .sum()    
        .unstack(-1)                    
        .fillna(0).reset_index()                      
        ) 

Entity type Primary ID  A   X       Y
0           0109    200.0   150.0   0.0
1           9996    400.0   150.0   50.0
2           A765    50.0    0.0     0.0

上面的数据可以转换成dict然后就可以map了。

完整的解决方案:

map_df = (df.groupby(['Primary ID', 'Entity type'])['Value']      
        .sum()    
        .unstack(-1)                    
        .fillna(0).reset_index()                      
        ).drop(['A'], axis=1).set_index('Primary ID')

df.set_index('Primary ID', inplace=True)
df.loc[df['Entity type'].eq('A'),['new_x', 'new_y']] = map_df.values

东风:

次要 ID 实体类型 价值 新的_x new_y
主要 ID
0109 0109 一个 200 150.0 0.0
0109 A234 X 100 0.0 0.0
0109 A234 X 50 0.0 0.0
9996 9996 一个 400 150.0 50.0
9996 AAGT X 120 0.0 0.0
9996 AABG X 30 0.0 0.0
9996 0082 50 0.0 0.0
A765 A765 一个 50 0.0 0.0

第一个解决方案首先使用Series.where的缺失值替换Value s,然后使用新列GroupBy.transform ,最后在DataFrame.mask中用0替换重复项:

cols = ['Sum of values Secondary id X','Sum of values Secondary id Y']
df[cols] = (df.assign(x = df['Value'].where(df['Entity type'].eq('X')),
                      y = df['Value'].where(df['Entity type'].eq('Y')))
              .groupby('Primary ID')[['x','y']]
              .transform('sum')
              .mask(df['Primary ID'].duplicated(), 0)
              .astype(int))
print (df)
  Primary ID Secondary ID Entity type  Value  Sum of values Secondary id X  \
0       0109         0109           A    200                           150   
1       0109         A234           X    100                             0   
2       0109         A234           X     50                             0   
3       9996         9996           A    400                           150   
4       9996         AAGT           X    120                             0   
5       9996         AABG           X     30                             0   
6       9996         0082           Y     50                             0   
7       A765         A765           A     50                             0   

   Sum of values Secondary id Y  
0                             0  
1                             0  
2                             0  
3                            50  
4                             0  
5                             0  
6                             0  
7                             0 

如果需要新列的所有值,请使用DataFrame.pivot_tableDataFrame.join

df1 = (df.pivot_table(index='Primary ID', 
                    columns='Entity type', 
                    values='Value', 
                    aggfunc='sum', fill_value=0)
         .add_prefix('Sum of values Secondary id '))


df = df.join(df1, on='Primary ID')
df.loc[df['Primary ID'].duplicated(), df1.columns] = 0
print (df)
  Primary ID Secondary ID Entity type  Value  Sum of values Secondary id A  \
0       0109         0109           A    200                           200   
1       0109         A234           X    100                             0   
2       0109         A234           X     50                             0   
3       9996         9996           A    400                           400   
4       9996         AAGT           X    120                             0   
5       9996         AABG           X     30                             0   
6       9996         0082           Y     50                             0   
7       A765         A765           A     50                            50   

   Sum of values Secondary id X  Sum of values Secondary id Y  
0                           150                             0  
1                             0                             0  
2                             0                             0  
3                           150                            50  
4                             0                             0  
5                             0                             0  
6                             0                             0  
7                             0                             0  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM