首页 > 解决方案 > 在 Python 中创建“无泄漏”变量?

问题描述

我有一个包含数千个观察值的 pandas 数据框,我想在 Python 中创建“无泄漏”变量。因此,我正在寻找一种方法来计算变量的组特定平均值,而无需在第 i 行中进行单个观察。例如:

| Group | Price | leakage-free Group Mean |  
-------------------------------------------
|   1   |  20   |           25            |
|   1   |  40   |           15            |
|   1   |  10   |           30            |
|   2   |  ...  |           ...           |

我想用几个变量来做到这一点,并且我想以这种方式创建均值、中值和方差,因此计算速度快的方法可能会很好。如果一个组只有一行,我想在无泄漏变量中输入 0。
由于我是 Python 的初学者,所以一些代码可能会很有帮助。谢谢你!!

标签: python-3.xpandas

解决方案


单线:

df = pd.DataFrame({'Group': [1,1,1,2], 'Price':[20,40,10,30]})

df['lfgm'] = df.groupby('Group').transform(lambda x: (x.sum()-x)/(len(x)-1)).fillna(0)

print(df)

输出:

   Group  Price  lfgm
0      1     20  25.0
1      1     40  15.0
2      1     10  30.0
3      2     30   0.0

更新:

对于中位数和方差(不幸的是,不是单行):

df = pd.DataFrame({'Group': [1,1,1,1,2], 'Price':[20,100,10,70,30]})

def f(x):
    for i in x.index:
        z = x.loc[x.index!=i, 'Price']
        x.at[i, 'mean'] = z.mean()
        x.at[i, 'median'] = z.median()
        x.at[i, 'var'] = z.var()
    return x[['mean', 'median', 'var']]

df = df.join(df.groupby('Group').apply(f))
print(df)

输出:

   Group  Price       mean  median          var
0      1     20  60.000000    70.0  2100.000000
1      1    100  33.333333    20.0  1033.333333
2      1     10  63.333333    70.0  1633.333333
3      1     70  43.333333    20.0  2433.333333
4      2     30        NaN     NaN          NaN

推荐阅读