【问题标题】:Inplace transformation pandas with groupby使用 groupby 就地转换 pandas
【发布时间】:2017-07-02 17:22:21
【问题描述】:

是否可以用groupby 语句对DataFrame 就地进行变异?

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['NEWCOL'] = dt.groupby('LETTER')['VALUE'].apply(lambda x: x - x.mean())
  • @JohnGalt 有订单保证吗?
  • 是的,您也可以自己验证。

标签: python pandas in-place


【解决方案1】:

我很确定你不能在 group by 期间改变数据帧。您可以执行完全相同的操作,将每个字母映射到它的平均值,然后执行操作。

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

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

另外,我在地图之后使用 .values 访问器,因为我不确定“映射”系列的索引是否与“VALUE”系列的索引相同,有时将导致 NaN。

【讨论】:

    【解决方案2】:

    我认为您可以使用 transform 返回与 Series 相同的长度和相同的索引 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-26
      • 2021-11-14
      • 2013-05-30
      • 2017-01-12
      • 1970-01-01
      • 2020-09-01
      • 2022-11-03
      • 2016-06-07
      相关资源
      最近更新 更多