Я хочу добавить несколько столбцов для групповых функций (стандартный, средний ...), приведенный ниже код работает, но набор данных действительно большой, а производительность плохая. Есть ли хорошая идея, чтобы улучшить код? Благодарность

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
'''
1
Sai Li 2 Мар 2018 в 04:33

3 ответа

Лучший ответ

Вы можете назвать среднее с индексом

df.assign(mean=df.A.map(df.set_index('A').C.mean(level=0)))
Out[28]: 
   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

Или используя get

df['mean']=df.set_index('A').C.mean(level=0).get(df.A).values
df
Out[35]: 
   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
2
YOBEN_S 2 Мар 2018 в 01:48

Вот один из способов:

s = df.groupby('A')['C'].mean()

df['mean'] = df['A'].map(s)

#    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

< Сильный > Объяснение

  • Сначала groupby 'A' и вычислите mean из 'C'. Это создает серию с индексами уникальных записей в «A» и значениями по мере необходимости.
  • Во-вторых, map эта серия на вашем фрейме данных. Это возможно, потому что pd.Series.map может принимать серию в качестве входных данных.
3
jpp 2 Мар 2018 в 01:36