熊猫数据框:计算共享分数

时间:2020-05-27 18:34:48

标签: python pandas dataframe

假设我有一个数据帧df,它由两个对象S的类,一组与它们关联的坐标XY组成,以及在那里测量的值V

数据框如下所示:

S X Y V
0 1 1 1
1 2 2 1
1 9 9 2
0 9 9 8

我想知道使我能够从这张照片转到将每个S转换为一系列列的命令,

  • V_s代表所有共享X-Y坐标的总和;
  • F0F1代表每个可能的类S的V分数。

例如:

X Y V_s  F0  F1
1 1 1  1.0 0.0
2 2 1  0.0 1.0
9 9 10 0.2 0.8

我可以使用

求和并求分数。
df['V_s'] = df.groupby(['X', 'Y'])['V'].transform('sum')
df['F'] = df['V']/df['V_s']

下一步是什么?

1 个答案:

答案 0 :(得分:1)

IIUC:

(df.groupby(['X','Y','S']).sum()
   .unstack('S', fill_value=0)['V']
   .rename(columns=lambda x: f"F{x}")
   .assign(V_s=lambda x: x.sum(1),
           F0 =lambda x: x['F0']/x['V_s'],
           F1 =lambda x: x['F1']/x['V_s'])
   .reset_index()
)

输出:

S  X  Y   F0   F1  V_s
0  1  1  1.0  0.0    1
1  2  2  0.0  1.0    1
2  9  9  0.8  0.2   10

更新S中未知/大量的类:

new_df = (df.groupby(['X','Y','S']).sum()
   .unstack('S', fill_value=0)['V']
   .rename(columns=lambda x: f"F{x}")
)

vs = new_df.sum(1)
new_df = (new_df.div(vs,axis='rows')
                .assign(V_s=vs)
                .reset_index()
         )

您将得到相同的输出。