2015-09-05 116 views
0

導入大型csv文件。以下是輸出結果,其中Flavor_ScoreOverall_Score是跨多個測試人員應用df.groupby('beer_name').mean()的結果。我想爲每個列添加一個列標準差:Flavor_ScoreOverall_Score到列平均值的右側。該功能很明確,但如何添加一列顯示?當然,我可以生成一個數組並追加它(對嗎?),但這似乎是一個麻煩的方法。將計算列添加到熊貓數據框中

Beer_name  Beer_Style  Flavor_Score   Overall_Score 

    Coors    Light   2.0     3.0 
    Sam Adams   Dark   4.0     4.5 
    Becks    Light   3.5     3.5 
    Guinness   Dark   2.0     2.2 
    Heineken   Light   3.5     3.7 
+0

這是你如何將列添加到數據幀的一個問題? –

+0

@Dimitris Jim - 是的 – Toly

+1

你可以做一些像yourDataFrame ['Flavor_Score_stddev'] = yourDataFrame ['Flavor_Score']。someFunction()使用someFunction()將'Flavor_Score'的值映射到新值,並將新值放入名爲「Flavor_Score_stddev」的新列。 – 2015-09-05 02:18:08

回答

0

你可以使用

df.groupby('Beer_name').agg(['mean','std']) 

這個計算的平均值和各組的性病。


例如,

import numpy as np 
import pandas as pd 
np.random.seed(2015) 

N = 100 
beers = ['Coors', 'Sam Adams', 'Becks', 'Guinness', 'Heineken'] 
style = ['Light', 'Dark', 'Light', 'Dark', 'Light'] 
df = pd.DataFrame({'Beer_name': np.random.choice(beers, N), 
        'Flavor_Score': np.random.uniform(0, 10, N), 
        'Overall_Score': np.random.uniform(0, 10, N)}) 
df['Beer_Style'] = df['Beer_name'].map(dict(zip(beers, style))) 

print(df.groupby('Beer_name').agg(['mean','std'])) 

產生

  Flavor_Score   Overall_Score   
        mean  std   mean  std 
Beer_name            
Becks   5.779266 3.033939  6.995177 2.697787 
Coors   6.521966 2.008911  4.066374 3.070217 
Guinness  4.836690 2.644291  5.577085 2.466997 
Heineken  4.622213 3.108812  6.372361 2.904932 
Sam Adams  5.443279 3.311825  4.697961 3.164757 
+0

它的工作原理。謝謝!一個警告:此方法計算我的數據框中所有列的mean和std。如何選擇特定列? – Toly

+0

@Toly'df.groupby('Beer_name')['Flavor_Score','Overall_Score']。agg(['mean','std'])' – Alexander

+0

@Alexander - 不應該在使用df之前對列進行排序。通過...分組 ? – Toly

0

groupby.agg([fun1, fun2])計算在一個步驟中任何數量的功能:

from random import choice, random 
import pandas as pd 
import numpy as np 

beers = ['Coors', 'Sam Adams', 'Becks', 'Guinness', 'Heineken'] 
styles = ['Light', 'Dark'] 

def generate(): 
    for i in xrange(0, 100): 
     yield dict(beer=choice(beers), style=choice(styles), 
        flavor_score=random()*10.0, 
        overall_score=random()*10.0) 

pd.options.display.float_format = ' {:,.1f} '.format 
df = pd.DataFrame(generate()) 
print df.groupby(['beer', 'style']).agg([np.mean, np.std]) 

=>

   flavor_score  overall_score  
         mean std   mean std 
beer  style           
Becks  Dark   7.1 3.6   1.9 1.6 
      Light  4.7 2.4   2.0 1.0 
Coors  Dark   5.5 3.2   2.6 1.1 
      Light  5.3 2.5   1.9 1.1 
Guinness Dark   3.3 1.4   2.1 1.1 
      Light  4.7 3.6   2.2 1.1 
Heineken Dark   4.4 3.0   2.7 1.0 
      Light  6.0 2.3   2.1 1.3 
Sam Adams Dark   3.4 3.0   1.7 1.2 
      Light  5.2 3.6   1.6 1.3 

如果我需要使用一個用戶定義的函數只是一個flavor_score列?比方說,我想從一個flavor_score列減去0.5(從所有行,除喜力,爲此我要添加0.25)

grouped[grouped.beer != 'Heineken']['flavor_score']['mean'] - 0.5 
grouped[grouped.beer == 'Heineken']['flavor_score']['mean'] + 0.25 
+0

@Alexander - 謝謝!這有幫助!還有一個問題:如果我需要將用戶定義的函數僅用於flavor_score列,該怎麼辦?假設我想從flavor_score列中減去0.5(來自所有行,除Heineken之外,我想爲其添加0.25)。我試圖使用df.loc運算符,但出於某種原因,列中的值沒有更改 – Toly

相關問題