是否需要指定groupby调用以在apply lambda函数中使用组名。
例如,如果我遍历组,我可以通过以下元组分解得到组密钥:
for group_name, subdf in temp_dataframe.groupby(level=0, axis=0):
print group_name
是否可以在apply函数中获取组名,例如:
temp_dataframe.groupby(level=0,axis=0).apply(lambda group_name, subdf: foo(group_name, subdf)
如何将组名作为apply lambda函数的参数?
谢谢!
答案 0 :(得分:19)
我认为您应该能够使用name
属性:
temp_dataframe.groupby(level=0,axis=0).apply(lambda x: foo(x.name, x))
应该有效,例如:
In [132]:
df = pd.DataFrame({'a':list('aabccc'), 'b':np.arange(6)})
df
Out[132]:
a b
0 a 0
1 a 1
2 b 2
3 c 3
4 c 4
5 c 5
In [134]:
df.groupby('a').apply(lambda x: print('name:', x.name, '\nsubdf:',x))
name: a
subdf: a b
0 a 0
1 a 1
name: b
subdf: a b
2 b 2
name: c
subdf: a b
3 c 3
4 c 4
5 c 5
Out[134]:
Empty DataFrame
Columns: []
Index: []
答案 1 :(得分:0)
对于那些正在寻找问题答案的人:
在 transform 函数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('a') \
.apply(lambda frame: frame \
.transform(lambda col: col + 3 if frame.name == 'a' and col.name == 'b' 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(即帧)的引用,该子帧包含相应子组的名称属性。转换参数(即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文档,因为最有可能针对您可能需要此构造的对象使用矢量化的解决方案。