首页 > 解决方案 > Pandas 中的 apply() 方法

问题描述

这里的任何人都知道下面这些代码实际上做了什么?我很困惑他们在“data1”上产生不同的结果。

这是第一个代码:

def norm_by_data2(x):
    # x is a DataFrame of group values
    x['data1'] /= x['data2'].sum()
    return x

print(df, "\n")
print(df.groupby('key').apply(norm_by_data2), "\n")

这是第二个代码:

pd.Series(df['data1'] / df['data2'].sum(), name='data1')

第一个代码的输出:

# How the DataFrame looks like
  key  data1  data2
0   A      0      5
1   B      1      0
2   C      2      3
3   A      3      3
4   B      4      7
5   C      5      9 

  key     data1  data2
0   A  0.000000      5
1   B  0.142857      0
2   C  0.166667      3
3   A  0.375000      3
4   B  0.571429      7
5   C  0.416667      9 

第二个代码的输出:

0    0.000000
1    0.037037
2    0.074074
3    0.111111
4    0.148148
5    0.185185
Name: data1, dtype: float64

标签: pythonpandasdataframegroup-byapply

解决方案


第一个版本适用于组,因此它计算sum()组中的元素

x['data2'].sum() # x is a DataFrame of group values

组内元素A使用 sum 8(5+3)
组内元素B使用 sum 7(0+7)
组内元素C使用 sum 12(3+9)

A 0/8  = 0.000000
B 1/7  = 0.142857 
C 2/12 = 0.166667 
A 3/8  = 0.375000
B 4/7  = 0.571429
C 5/12 = 0.416667

第二版计算sum()所有元素27(5+0+3+3+7+9)

A 0/27 = 0.000000
B 1/27 = 0.037037
C 2/27 = 0.074074
A 3/27 = 0.111111
B 4/27 = 0.148148
C 5/27 = 0.185185

如果你使用print(x['data2'].sum()),那么你应该看到它。


推荐阅读