数据框列值计算和替换

时间:2015-09-10 22:48:43

标签: python pandas replace dataframe calculated-columns

需要您帮助计算DF列的新值,然后用计算值替换旧值。我是新手并且在粘贴代码时遇到了问题(道歉):

在[36]中:

import pandas as pd
import numpy as np
import math
import random

df = pd.DataFrame({'beerstyle': ['light', 'dark','light', 'dark'], 'beername': ['coors', 'guiness','bud', 'guiness'],'flavor': [5,3,3,1], 'taste': [4,5,2,3]})
df

缺货[36]:

beername    beerstyle   flavor  taste
0   coors     light         5    4
1   guiness   dark          3    5
2   bud       light         3    2
3   guiness   dark          1    3

brStmean = df.loc[(df["beerstyle"]=='light')].flavor.mean()

brStmean1 = df.loc[(df["beerstyle"]=='dark')].flavor.mean()

brNamean = df.loc[(df["beername"]=='guiness')].flavor.mean()
df.loc[(df["beerstyle"]=='dark')].flavor - brStmean1

这很好用。计算值

然而,当我尝试:

df=df.loc[(df["beerstyle"]=='dark')].flavor - brStmean1
df

KeyError                                  Traceback (most recent call last)
<ipython-input-41-5f276edddc66> in <module>()
----> 1 df=df.loc[(df["beerstyle"]=='dark')].flavor - brStmean1
2 df

C:\Users\Toly\Anaconda\lib\site-packages\pandas\core\series.pyc in __getitem__(self, key)
519     def __getitem__(self, key):
520         try:
--> 521             result = self.index.get_value(self, key)
522 
523             if not np.isscalar(result):


1593 
1594         try:
 -> 1595             return self._engine.get_value(s, k)
1596         except KeyError as e1:
1597             if len(self) > 0 and self.inferred_type in ['integer','boolean']:

pandas\index.pyx in pandas.index.IndexEngine.get_value (pandas\index.c:3113)()

pandas\index.pyx in pandas.index.IndexEngine.get_value (pandas\index.c:2844)()

pandas\index.pyx in pandas.index.IndexEngine.get_loc (pandas\index.c:3761)()

KeyError: 'beerstyle'

这是否意味着我无法用计算值替换列?那么如何创建一个新的DF,其唯一的区别是计算列?

谢谢!

1 个答案:

答案 0 :(得分:0)

你可以这样做:

df['flavor'] = df['flavor'].mask(df["beerstyle"] == 'dark', df['flavor'] - brStmean1)

虽然这种类型的操作通常更清晰,表示为groupby

df['flavor'] = df.groupby('beerstyle')['flavor'].transform(lambda x: x - x.mean())

编辑:

扩展为什么你的旧方法不起作用 - 当你做df = ...时,python会将右侧发生的任何事情分配给名称df。像这样的裸体赋值(不确定该术语到底是什么)不能在pandas或其他方面修改现有对象。

所以你需要做一些事情,&#34;这是我要分配给的DataFrame的一部分。&#34;要再次使用您的代码,一种方法是精确索引要在两侧替换的DataFrame部分。 E.g。

df.loc[(df["beerstyle"]=='dark'), 'flavor'] = df.loc[(df["beerstyle"]=='dark'), 'flavor'] - brStmean1

正如您所看到的,写入(重复条件)有点尴尬,.mask只是一个方便的方法,它返回条件为真的新值,否则返回旧的值,所以你可以直接分配到df["flavor"]