首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在SeriesGroupBy上执行应用程序()之后,我如何“重新分组”我的系列?

在SeriesGroupBy上执行应用程序()之后,我如何“重新分组”我的系列?
EN

Stack Overflow用户
提问于 2019-08-26 13:23:58
回答 4查看 456关注 0票数 1

我需要调整一个现有函数,该函数实质上执行一个Series.str.contains并返回结果的Series,以便能够将SeriesGroupBy作为输入处理。

根据熊猫错误信息的建议

无法访问“SeriesGroupBy”对象的属性“str”,请尝试使用“应用”方法

我尝试在apply()对象上使用SeriesGroupBy,这在某种程度上是工作的,但会导致Series对象。现在,我想对这个Series应用与以前相同的分组。

原始函数

代码语言:javascript
复制
def contains(series, expression):
    return series.str.contains(expression)

到目前为止我的尝试

代码语言:javascript
复制
>>> 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)**,,以便下面的代码能够工作:**

代码语言:javascript
复制
>>> 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
EN

Stack Overflow用户

发布于 2019-08-26 14:50:28

_f完全没有关系。处理这个问题的方法是在分组之前定义一个列(不是一个单独的函数),然后分组。现在,该列(称为'to_sum')是Series.GroupBy对象的一部分。

代码语言:javascript
复制
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返回的序列加为组(因为它们将共享相同的索引)

代码语言:javascript
复制
_f(df['text'], 'b').groupby(df['group']).sum()
票数 1
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57658806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档