【问题标题】:how to iterate over a pandas groupby object while using if statement in python [duplicate]如何在python中使用if语句时迭代pandas groupby对象[重复]
【发布时间】:2020-12-18 06:11:06
【问题描述】:

我有一个看起来像这样的熊猫数据框 df:

| source_num| source_date| text      | category    |location    | source |
+---------+------------+-------------+-------------+------------+--------+---
|  0      | 15/12/2020 | text1       | cat 1       | loc1       |soucrce1|
|  1      | 15/12/2020 | text2       | cat 2       | loc2       |source 2|
|  2      | 15/12/2020 | text3       | cat 3       | loc2       |source 3|
|  3      | 15/12/2020 | text4       | cat 2       | loc3       |source 2|
| ...     | ...        | ...         |             |            |        |

运行 GroupBy 函数时 然后过滤 location 中的特定值,它会返回正确的答案。

grouped = df.groupby(['category','source_num',"source","location"], as_index = False).aggregate('sum')

 grouped.loc[grouped["location"] == "loc2"]

我的问题是,我怎样才能像这样执行多个过滤器:

第一个过滤器:

grouped.loc[grouped["location"] == "loc2"]

第二个过滤器:

grouped.loc[grouped["location"] == "loc2" & grouped["category"] .str.contains('cat1')]

第三个过滤器: ....

我想我可以通过使用 if/else 语句 对象迭代 groupby 来执行上述过滤器,对吗??

基于第一个和第二个过滤器过滤后的预期结果:

| source_num| source_date| text      | category    |location    | source |
+---------+------------+-------------+-------------+------------+--------+---
|  0      | 15/12/2020 | text2       | cat 2       | loc2       |soucrce2|
|  1      | 15/12/2020 | text3       | cat 3       | loc2       |source 3|

第一个过滤器已完成,而第二个过滤器不符合 if 语句,因此系统不会进入第二个过滤器。

【问题讨论】:

  • 请阅读下面链接中的文档,并说明您已经尝试过的内容以及您目前所处的位置。 pandas.pydata.org/pandas-docs/stable/user_guide/…
  • @skuzzy 不,我希望 like for 语句遍历 groupby 的结果,然后根据几个 if /else 语句,最后一个结果将显示最终结果。
  • @skuzzy 我不明白索引有什么?直到现在我能够获得 groupby 对象而不是执行第一个过滤器..我想要的是能够执行多个过滤器并将最终结果作为一个数据帧返回....也许我可以执行每个过滤器然后合并所有一个数据框中每个过滤器的结果可以这样做吗??
  • 您不需要 for 循环迭代来应用条件测试 - 一个或多个。 groupby 的结果也在一个有效的数据框中,并遵循与任何其他相同的索引规则。 pandas dataframe 请参阅我的 cmets 中的链接,了解布尔索引如何与一个或多个条件子句一起使用。 Pandas 强烈建议不要对数据框进行迭代 - pandas.pydata.org/pandas-docs/stable/user_guide/…

标签: python pandas iteration pandas-groupby


【解决方案1】:

如果你想要一个for 循环和if/statements 循环通过grouped 对象

for name, grouped in grouped:
   if ...

【讨论】:

  • 所以根据您在if/statement 中的回答,我输入了if (grouped.loc[grouped["location"] == "loc2"]): grouped.loc[grouped["location"] == "loc2"] elif (grouped.loc[grouped["location"] == "loc2" & grouped["category"] .str.contains('cat1')]): (grouped.loc[grouped["location"] == "loc2" & grouped["category"] .str.contains('cat1')] else: ....
  • 正确;但是,请记住 if 语句检查的是 bool 而非数组,您可以使用 all() 获取 (grouped["location"] == "loc2").all() 的 bool
  • 但我在哪里使用 name
  • 看起来你不需要它,把它打印成你的循环然后看看
  • 我试过了,它崩溃并显示以下错误:ValueError Traceback (most recent call last) <ipython-input-154-83aeadeaa384> in <module> ----> 1 for name, grouped in grouped: ValueError: too many values to unpack (expected 2)
猜你喜欢
  • 2020-10-14
  • 1970-01-01
  • 2018-07-29
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
  • 2011-08-22
  • 2013-10-08
相关资源
最近更新 更多