用groupby转换变换熊猫

时间:2017-02-14 12:10:00

标签: python pandas in-place

是否可以使用groupby声明改变DataFrame inplace

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']

2 个答案:

答案 0 :(得分:1)

我非常确定你不能在一组中改变数据帧。您可以使用它的平均值完成相同的操作映射每个字体,然后执行操作。

df['NEW_COL'] = df['VALUE'] - df['LETTER'].map(dt.groupby("LETTER")['VALUE'].mean()).values

这将处理任何可能的订购问题,即使经过测试我也不会信任。比抱歉更安全:)

此外,我在地图后使用 .values 访问者,因为我不确定"映射"的索引是什么?系列将与' VALUE'相同。系列,有时会导致NaN。

答案 1 :(得分:1)

我认为您可以使用transform返回Seriesdf相同的长度和相同的索引来减去:

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