使用 groupby 就地转换 pandas
Inplace transformation pandas with groupby
是否可以用 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']
我很确定您不能在分组依据期间改变数据帧。您可以执行完全相同的操作,将每个字母映射到它的意思,然后执行该操作。
df['NEW_COL'] = df['VALUE'] - df['LETTER'].map(dt.groupby("LETTER")['VALUE'].mean()).values
这将处理任何可能的订购问题,我不相信即使经过测试也不能保证。安全总比后悔好:)
此外,我在地图后使用 .values 访问器,因为我不确定 "mapped" 系列的索引与'VALUE' 系列,有时会产生 NaN。
我认为你可以使用 transform
其中 return 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
是否可以用 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']
我很确定您不能在分组依据期间改变数据帧。您可以执行完全相同的操作,将每个字母映射到它的意思,然后执行该操作。
df['NEW_COL'] = df['VALUE'] - df['LETTER'].map(dt.groupby("LETTER")['VALUE'].mean()).values
这将处理任何可能的订购问题,我不相信即使经过测试也不能保证。安全总比后悔好:)
此外,我在地图后使用 .values 访问器,因为我不确定 "mapped" 系列的索引与'VALUE' 系列,有时会产生 NaN。
我认为你可以使用 transform
其中 return 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