如何在python中使用if语句时迭代pandas groupby对象
我有一个熊猫数据帧df,看起来像这样:如何在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| |
| 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)