2017-09-04 102 views
2

說我已經得到了數據幀:其滿足大熊貓數據幀一定條件的所有行的平均

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」

回答

3

您可以使用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 
+0

這是更快&與更多評論一起工作!謝謝! – christaylor

+0

什麼是您發現此設置更快的設置(每組的行數/行數)? – ayhan

+0

這裏的性能可以說是與輸入大小相關的。實際上,這種方法對於具有4組數據的8行數據來說更快,但是對於更多行數據(比如10^6)會受到很大影響。值得注意的是。 – miradulo

1

這是由代碼分組後的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