說我已經得到了數據幀:其滿足大熊貓數據幀一定條件的所有行的平均
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」
說我已經得到了數據幀:其滿足大熊貓數據幀一定條件的所有行的平均
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
但測試結果後也不去贊成transform
較大dataframes(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
這是由代碼分組後的transform
方法具有很好的應用的平均值。
>>> df['Group_means'] = df.groupby('Code').transform('mean')
>>> df
Code Value Group_means
0 X 135 173.50
1 D 298 256.75
2 F 301 301.00
3 G 12 12.00
4 D 203 256.75
5 X 212 173.50
6 D 401 256.75
7 D 125 256.75
這是更快&與更多評論一起工作!謝謝! – christaylor
什麼是您發現此設置更快的設置(每組的行數/行數)? – ayhan
這裏的性能可以說是與輸入大小相關的。實際上,這種方法對於具有4組數據的8行數據來說更快,但是對於更多行數據(比如10^6)會受到很大影響。值得注意的是。 – miradulo