假设我有一个数据帧df
,它由两个对象S
的类,一组与它们关联的坐标X
和Y
组成,以及在那里测量的值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
坐标的总和; F0
和F1
代表每个可能的类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']
下一步是什么?
答案 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()
)
您将得到相同的输出。