假设我有数据框:
Code Value
1 X 135
2 D 298
3 F 301
4 G 12
5 D 203
6 X 212
7 D 401
8 D 125
我想在此数据框中创建一个新列,用于计算数据框中所有行的平均值,其中“代码”列中的值是每行中的相应值。
例如,在第 1 行中,“平均值”列将查找代码为“X”的所有行的平均值
最佳答案
您可以这样使用 pd.Series.map()
:
df['Code_mean'] = df.Code.map(df.groupby(['Code']).Value.mean())
>>> df
Out[]:
Code Value Code_mean
1 X 135 173.50
2 D 298 256.75
3 F 301 301.00
4 G 12 12.00
5 D 203 256.75
6 X 212 173.50
7 D 401 256.75
8 D 125 256.75
这似乎比transform
方法更快。
编辑:回答评论的基准
import pandas as pd
from string import ascii_letters
df = pd.DataFrame(columns=['Code', 'Value'])
df.Code = [ascii_letters[26:][i] for i in np.random.randint(0, 26, 10000)]
df.Value = np.random.randint(0, 1024, 10000)
>>> %%timeit
... df['Code_mean'] = df.Code.map(df.groupby(['Code']).Value.mean())
1000 loops, best of 3: 1.45 ms per loop
# Reinit df before next timeit
>>> %%timeit
... df.assign(Code_mean=df.groupby('Code').transform('mean'))
100 loops, best of 3: 2.31 ms per loop
但是在测试结果确实支持对更大的数据帧(10^6 行)进行转换
import pandas as pd
from string import ascii_letters
df = pd.DataFrame(columns=['Code', 'Value'])
df.Code = [ascii_letters[26:][i] for i in np.random.randint(0, 26, 1000000)]
df.Value = np.random.randint(0, 1024, 1000000)
>>> %%timeit
... df['Code_mean'] = df.Code.map(df.groupby(['Code']).Value.mean())
10 loops, best of 3: 95.2 ms per loop
# Reinit df before next timeit
>>> %%timeit
... df.assign(Code_mean=df.groupby('Code').transform('mean'))
10 loops, best of 3: 68.2 ms per loop
关于python - Pandas 数据框中满足特定条件的所有行的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46042786/