需要您帮助计算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,其唯一的区别是计算列?
谢谢!
答案 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"]