我需要调整一个现有函数,该函数实质上执行一个Series.str.contains并返回结果的Series,以便能够将SeriesGroupBy作为输入处理。
根据熊猫错误信息的建议
无法访问“SeriesGroupBy”对象的属性“str”,请尝试使用“应用”方法
我尝试在apply()对象上使用SeriesGroupBy,这在某种程度上是工作的,但会导致Series对象。现在,我想对这个Series应用与以前相同的分组。
原始函数
def contains(series, expression):
return series.str.contains(expression)到目前为止我的尝试
>>> import pandas as pd
... from functools import partial
...
... def _f(series, expression):
... return series.str.contains(expression)
...
... def contains(grouped_series, expression):
... result = grouped_series.apply(partial(_f, expression=expression))
... return result
>>> df = pd.DataFrame(zip([1,1,2,2], ['abc', 'def', 'abq', 'bcq']), columns=['group', 'text'])
>>> gdf = df.groupby('group')
>>> gs = gdf['text']
>>> type(gs)
<class 'pandas.core.groupby.generic.SeriesGroupBy'>
>>> r = contains(gdf['text'], 'b')
>>> r
0 True
1 False
2 True
3 True
Name: text, dtype: bool
>>> type(r)
<class 'pandas.core.series.Series'>所需的结果将由与原始grouped_series相同的索引组成的布尔序列来实现。
实际结果是没有任何分组的Series对象。
编辑/澄清:
最初的答案让我觉得我没有足够强调问题的核心。为了解决这个问题,让我们假设我不能更改contains(grouped_series, expression)函数之外的任何内容。我想我知道如何解决我的问题,如果我从另一个角度处理它,如果我不这样做,那将成为另一个问题。现实世界的环境使得在该函数之外更改代码变得非常复杂。因此,我非常感谢在这一限制条件下工作的建议。
因此,让我将问题改写如下:
我正在寻找一个函数contains(grouped_series, expression)**,,以便下面的代码能够工作:**
>>> df = pd.DataFrame(zip([1,1,2,2], ['abc', 'def', 'abq', 'bcq']), columns=['group', 'text'])
>>> grouped_series = contains(df.groupby('group')['text'], 'b')
>>> grouped_series.sum()
group
1 1.0
2 2.0
Name: text, dtype: float64发布于 2019-08-26 14:50:28
_f与完全没有关系。处理这个问题的方法是在分组之前定义一个列(不是一个单独的函数),然后分组。现在,该列(称为'to_sum')是Series.GroupBy对象的一部分。
df.assign(to_sum = _f(df['text'], 'b')).groupby('group').to_sum.sum()
#group
#1 1.0
#2 2.0
#Name: to_sum, dtype: float64如果后续操作不需要整个DataFrame,则可以使用df将_f返回的序列加为组(因为它们将共享相同的索引)
_f(df['text'], 'b').groupby(df['group']).sum()https://stackoverflow.com/questions/57658806
复制相似问题