如何在python中使用if语句时迭代pandas groupby对象

如何在python中使用if语句时迭代pandas groupby对象,python,pandas,iteration,pandas-groupby,Python,Pandas,Iteration,Pandas Groupby,我有一个熊猫数据帧df,看起来像这样: | source_num| source_date| text | category |location | source | +---------+------------+-------------+-------------+------------+--------+--- | 0 | 15/12/2020 | text1 | cat 1 | loc1 |soucrce1| |

我有一个熊猫数据帧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函数时 然后过滤位置中的特定值,返回正确答案

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

 grouped.loc[grouped["location"] == "loc2"]
我的问题是,如何执行一个以上的过滤器:

| 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|
| ...     | ...        | ...         |             |            |        |
第一个过滤器:

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语句,因此系统不会进入第二个过滤器。

如果希望通过
分组
对象使用
if/statements
进行
for
循环

for name, grouped in grouped:
   if ...

如果希望使用
If/statements
通过
grouped
对象进行
for
循环

for name, grouped in grouped:
   if ...


这回答了你的问题吗?请阅读下面链接中的文档,并说明您已经尝试过的内容以及您目前的位置@skuzzy否我想让like for语句在groupby的结果上迭代,然后根据几个if/else语句,最后的结果将显示最终结果。@skuzzy我不明白我在索引方面做了什么??直到现在,我能够得到groupby对象,而不是执行第一个过滤器。。我想要的是能够执行多个过滤器并将最终结果作为一个数据帧返回。。。。也许我可以在一旁执行每个过滤器,然后将每个过滤器的所有结果合并到一个数据帧中,这是可以做到的??您不需要for循环迭代来应用条件测试-一个或多个。
groupby
的结果也位于有效的数据帧中,并遵循与任何其他结果相同的索引规则。请参考我的评论中的链接,了解布尔索引如何处理一个或多个条件子句。Pandas强烈建议不要在数据帧上执行itreation-这是否回答了您的问题?请阅读下面链接中的文档,并说明您已经尝试过的内容以及您目前的位置@skuzzy否我想让like for语句在groupby的结果上迭代,然后根据几个if/else语句,最后的结果将显示最终结果。@skuzzy我不明白我在索引方面做了什么??直到现在,我能够得到groupby对象,而不是执行第一个过滤器。。我想要的是能够执行多个过滤器并将最终结果作为一个数据帧返回。。。。也许我可以在一旁执行每个过滤器,然后将每个过滤器的所有结果合并到一个数据帧中,这是可以做到的??您不需要for循环迭代来应用条件测试-一个或多个。
groupby
的结果也位于有效的数据帧中,并遵循与任何其他结果相同的索引规则。请参考我的评论中的链接,了解布尔索引如何处理一个或多个条件子句。熊猫强烈建议不要在数据帧上执行itreation-因此,根据您在
if/语句中的回答,我将
if(grouped.loc[grouped[“location”]=“loc2”]):grouped.loc[grouped[“location”]=“loc2”]:(grouped.loc[grouped[“location”]=“loc2”&grouped[“category”]):(grouped.loc[grouped[“location”]==“loc2”&grouped[“category”].str.contains('cat1')]否则:…
正确;但是,请记住,如果语句检查bool not数组,则可以使用
all()
获取
(grouped[“location”]==“loc2”).all()的bool
但在我使用名称的地方,您似乎不需要它,请在循环时打印它,然后查看我尝试过了,它崩溃了,并显示以下错误:
ValueError Traceback(最近一次调用)在-->1中显示name,分组在grouped中:ValueError:太多值无法解压缩(预期为2)
so根据你在
if/声明中的回答
if(grouped.loc[grouped[“location”]=“loc2”]):grouped.loc[grouped[“location”]=“loc2”]elif(grouped.loc[grouped[“location”]=“loc2”&grouped[“category”]):(grouped.loc[grouped[“location”]=“loc2”&grouped[“category”].str.contains('cat1')]else:…
正确;但是,请记住,如果语句检查bool not数组,则可以使用
all()
获取
(分组的[“位置”]=“loc2”).all()的bool
但在我使用名称的地方,您似乎不需要它,请在循环时打印它,然后查看我尝试了,它崩溃了,并显示以下错误:
ValueError Traceback(最近一次调用)在-->1中显示name,分组在grouped中:ValueError:太多值无法解压缩(预期为2)