Python按一列分组并计算另一列的百分比

时间:2019-01-09 07:02:50

标签: python pandas group-by

我有一个数据框,如下所示:

SizeOfExposure

我正在尝试通过Frame号来计算每个行组的df.groupby("Frame")["SizeOfExposure"].sum() 的百分比。

我尝试了以下操作:

df['SizeOfExpPerc']=df["SizeOfExposure"]/df.groupby("Frame")["SizeOfExposure"].sum()

这将为每个帧打印SizeOfExposure的总和。但是,当我尝试

    Frame   SizeOfExposure  SizeOfExpPerc
0    1         5                  0.5
1    1         5                  0.5
2    2         7                  1.0
3    3         2                  0.2
4    3         8                  0.8

我在大多数行中都填写了“ Nan”。我该如何计算?所需的输出是

.meta {
  position: absolute;
  right: 0;
  text-align: left;
}

2 个答案:

答案 0 :(得分:3)

使用GroupBy.transform来返回df['SizeOfExpPerc']=df["SizeOfExposure"]/df.groupby("Frame")["SizeOfExposure"].transform('sum') print (df) Frame SizeOfExposure SizeOfExpPerc 0 1 5 0.5 1 1 5 0.5 2 2 7 1.0 3 3 2 0.2 4 3 8 0.8 ,其大小与原始DataFrame相同,并用聚合值填充,因此可能的除法:

print (df.groupby("Frame")["SizeOfExposure"].transform('sum'))
0    10
1    10
2     7
3    10
4    10
Name: SizeOfExposure, dtype: int64

详细信息

{{1}}

答案 1 :(得分:1)

@jezrael的方法可能更有效,但这是使用groupbyapply的替代解决方案。

>>> df.assign(SizeOfExpPerc=df.groupby('Frame')['SizeOfExposure'].apply(
        lambda group: group / group.sum()))
   Frame  SizeOfExposure  SizeOfExpPerc
0      1               5            0.5
1      1               5            0.5
2      2               7            1.0
3      3               2            0.2
4      3               8            0.8