Skip to main content
 首页 » 编程设计

python之改善 Pandas 的设置值

2025年05月04日12kuangbin

我想为组特征(std、mean...)添加一些列,下面的代码有效,但数据集真的很大而且性能很差。有改进代码的好主意吗?谢谢

import pandas as pd 
 
df = pd.DataFrame([[1,2,1], [1,2,2], [1,3,3], [1,3,4],[2,8,9], [2,11,11]], columns=['A', 'B', 'C']) 
df['mean'] = 0 
 
df2 = df.groupby('A') 
for a, group in df2: 
    mean = group['C'].mean() 
    df.loc[df['A'] == a, 'mean'] = mean 
 
df 
''' 
     A   B   C  mean 
0   1   2   1   2.5 
1   1   2   2   2.5 
2   1   3   3   2.5 
3   1   3   4   2.5 
4   2   8   9   10.0 
5   2   11  11  10.0 
''' 

请您参考如下方法:

Pandas 的 groupby.transform完成在原始索引中广播聚合统计信息的工作。这使其非常适合您的目的,应该被视为执行此任务的惯用方式。

生成带有新列的 df 副本的流水线解决方案

df.assign(Mean=df.groupby('A').C.transform('mean')) 
 
   A   B   C  Mean 
0  1   2   1   2.5 
1  1   2   2   2.5 
2  1   3   3   2.5 
3  1   3   4   2.5 
4  2   8   9  10.0 
5  2  11  11  10.0 

就地分配

df['Mean'] = df.groupby('A').C.transform('mean') 
df 
 
   A   B   C  Mean 
0  1   2   1   2.5 
1  1   2   2   2.5 
2  1   3   3   2.5 
3  1   3   4   2.5 
4  2   8   9  10.0 
5  2  11  11  10.0 

或者,您可以使用 pd.factorize 和 np.bincount

f, u = pd.factorize(df.A.values) 
totals = np.bincount(f, df.C.values) 
counts = np.bincount(f) 
df.assign(Mean=(totals / counts)[f]) 
 
   A   B   C  Mean 
0  1   2   1   2.5 
1  1   2   2   2.5 
2  1   3   3   2.5 
3  1   3   4   2.5 
4  2   8   9  10.0 
5  2  11  11  10.0