在应用函数中包含组名 pandas python
Including the group name in the apply function pandas python
是否可以在 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 函数的参数?
我认为您应该可以使用 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: []
对于那些前来寻找问题答案的人:
Including the group name in the transform function 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(即框架)的引用,该子pandas.core.frame.DataFrame(即框架)包含相应子组的名称属性。 transform 参数的名称属性(即 col)指的是 column/series 名称。
或者,也可以遍历组,然后在每个组内遍历列:
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 文档,因为很可能有一个更简单的矢量化解决方案来解决您可能需要此构造的问题。
是否可以在 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 函数的参数?
我认为您应该可以使用 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: []
对于那些前来寻找问题答案的人:
Including the group name in the transform function 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(即框架)的引用,该子pandas.core.frame.DataFrame(即框架)包含相应子组的名称属性。 transform 参数的名称属性(即 col)指的是 column/series 名称。
或者,也可以遍历组,然后在每个组内遍历列:
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 文档,因为很可能有一个更简单的矢量化解决方案来解决您可能需要此构造的问题。