【问题标题】:Adding calculated columns to the Dataframe in pandas将计算列添加到熊猫中的数据框
【发布时间】:2015-09-05 01:09:21
【问题描述】:

导入了一个大的 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

【问题讨论】:

  • 这是一个如何向数据框添加列的问题吗?
  • 您可以执行类似 yourDataFrame['Flavor_Score_stddev'] = yourDataFrame['Flavor_Score'].someFunction() 的操作,使用 someFunction() 将 'Flavor_Score' 的值映射到新值并将新值放入一个名为“Flavor_Score_stddev”的新列。

标签: python pandas dataframe mean calculated-columns


【解决方案1】:

你可以使用

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

【讨论】:

  • 它有效。谢谢!一个警告:此方法计算我数据框中所有列的均值和标准差。如何选择特定的列?
  • @Toly df.groupby('Beer_name')['Flavor_Score', 'Overall_Score'].agg(['mean','std'])
  • @Alexander - 我不应该在使用 df.groupby 之前对列进行排序吗?
【解决方案2】:

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

【讨论】:

  • @Alexander - 谢谢!这有帮助!还有一个问题:如果我只需要使用用户定义的函数来处理 flavor_score 列怎么办?假设我想从 flavor_score 列中减去 0.5(从所有行中,除了喜力,我想为其添加 0.25)。我尝试使用 df.loc 运算符,但由于某种原因,列中的值没有改变
猜你喜欢
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 2017-08-21
  • 1970-01-01
  • 2016-09-08
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
相关资源
最近更新 更多