Python groupby的就地转换

Python groupby的就地转换,python,pandas,in-place,Python,Pandas,In Place,是否有可能使用groupby语句在原地对数据帧进行变异 import pandas as pd dt = pd.DataFrame({ "LETTER": ["a", "b", "c", "a", "b"], "VALUE" : [10 , 12 , 13, 0, 15] }) def __add_new_col(dt_): dt_['NEW_COL'] = dt_['V

是否有可能使用
groupby
语句在原地对数据帧进行变异

import pandas as pd
dt = pd.DataFrame({
                   "LETTER": ["a", "b", "c", "a", "b"],
                   "VALUE" : [10 , 12 , 13,  0,  15]
                   })
def __add_new_col(dt_):
    dt_['NEW_COL'] = dt_['VALUE'] - dt_['VALUE'].mean()
    return dt_
pass


dt.groupby("LETTER").apply(__add_new_col)
  LETTER  VALUE  NEW_COL
0      a     10      5.0
1      b     12     -1.5
2      c     13      0.0
3      a      0     -5.0
4      b     15      1.5


dt
  LETTER  VALUE
0      a     10
1      b     12
2      c     13
3      a      0
4      b     15

在R data.table中,可以使用
:=
运算符,例如
dt[,col:=…,by='LETTER']

我很确定在分组过程中不能对数据帧进行变异。你可以做完全相同的操作,用它的平均值映射每个字母,然后执行操作

df['NEW_COL'] = df['VALUE'] - df['LETTER'].map(dt.groupby("LETTER")['VALUE'].mean()).values
这将处理任何可能的订购问题,我不相信即使经过测试也能保证。安全总比遗憾好:)

此外,我在映射后使用.values访问器,因为我不确定“映射”序列的索引与“值”序列的索引是否相同,有时会产生NaN。

我认为可以使用该方法返回
序列
df
相同的长度和索引,并使用减法:

print (dt.groupby("LETTER")['VALUE'].transform('mean'))
0     5.0
1    13.5
2    13.0
3     5.0
4    13.5
Name: VALUE, dtype: float64

dt['NEW_COL'] = dt['VALUE'] - dt.groupby("LETTER")['VALUE'].transform('mean')
print (dt)
  LETTER  VALUE  NEW_COL
0      a     10      5.0
1      b     12     -1.5
2      c     13      0.0
3      a      0     -5.0
4      b     15      1.5

为什么不
df['NEWCOL']=dt.groupby('LETTER')['VALUE'].apply(lambda x:x-x.mean())
?@JohnGalt是否有订单担保?是的,您也可以自己验证。