对于那些来寻找问题答案的人:
在转换函数 pandas python中包含组名
并最终出现在这个线程中,请继续阅读。
给定以下输入:
df = pd.DataFrame(data={'col1': list('aabccc'),
'col2': np.arange(6),
'col3': np.arange(6)})
数据:
col1 col2 col3
0 a 0 0
1 a 1 1
2 b 2 2
3 c 3 3
4 c 4 4
5 c 5 5
我们可以像这样访问组名(从调用apply函数的范围内可见):
df.groupby('col1') \
.apply(lambda frame: frame \
.transform(lambda col: col + 3 if frame.name == 'a' and col.name == 'col2' else col))
输出:
col1 col2 col3
0 a 3 0
1 a 4 1
2 b 2 2
3 c 3 3
4 c 4 4
5 c 5 5
请注意,需要调用 apply 以获得对子 pandas.core.frame.DataFrame(即帧)的引用,该子帧包含相应子组的 name 属性。transform 的参数(即 col)的 name 属性是指列/系列名称。
或者,也可以循环遍历组,然后在每个组中遍历列:
for grp_name, sub_df in df.groupby('col1'):
for col in sub_df:
if grp_name == 'a' and col == 'col2':
df.loc[df.col1 == grp_name, col] = sub_df[col] + 3
我的用例很少见,这是实现我的目标的唯一方法(截至 pandas v0.24.2)。但是,我建议彻底探索 pandas 文档,因为对于您可能需要此构造的内容,很可能有一个更简单的矢量化解决方案。