python - 按索引列过滤分组数据集
问题描述
我正在尝试完成 Pandas 练习,这让我发疯。
我有一个数据集,其中包含每天每小时经过城市某个区域的骑自行车者的数量,所以是这样的:
年 | 月 | 天 | 小时 | 1区 | 2区 | 3区 |
---|---|---|---|---|---|---|
2014 | 1 | 1 | 0:00 | 2 | 0 | 5 |
2014 | 1 | 1 | 1:00 | 3 | 1 | 2 |
2014 | 1 | 1 | 2:00 | 4 | 1 | 1 |
等等。还有更多的行和列。“区域”列包含当时该区域记录了多少骑自行车的人。
该练习要求按年、月和日对该数据框进行分组,然后对分组的数据框求和。我这样做:
grouped = data.groupby(["Year", "Month", "Day"]).sum()
其中“数据”是原始的未分组数据框。结果数据框在索引列中有元组,正如练习文本所说的那样。打印 grouped.head() 会返回:
(我删除了“小时”列,因为练习是这样说的。)我通过打印 grouped.index 验证了索引列确实包含元组,它看起来像这样:[(2014,1,1), (2014,1, 2), ...]
这一切都很好,但随后练习要求过滤此数据框,以便仅显示 2017 年 8 月的记录。我知道我可以这样做
grouped.filter(some-function-here)
但问题是,我很难理解如何根据索引列进行过滤(它没有名称,不能像其他人那样引用,例如分组[“Auroransilta”]) ,尤其是因为我不确定我是否正确地进行了元组比较。例如,我尝试过这种方式
grouped.filter(lambda x: x > (2014, 1, 1) for x in grouped.index)
我得到了这个:
该方法的变体都会导致空数据框。以为我只是对元组做错了,我试图按其他列进行过滤:
grouped.filter(lambda x: x["Baana"] > 300 for x in grouped)
这也导致了完全相同的空数据框。(“Baana”列不在屏幕截图中,但在数据框中,是的,有些行的计数大于 300)。如果我省略了 for 循环,我会收到一个 TypeError 说我没有传递一个可迭代对象,所以我猜它需要在那里,即使我不完全理解为什么(我认为过滤器只会应用我传递的函数到分组中的每个组。)
我不知道如何解决这个问题,因为我不明白我做错了什么。
解决方案
使用partial string indexing
, 与DatetimeIndex
:
df['datetime'] = pd.to_datetime(df[["Year", "Month", "Day"]])
df = df.drop(["Year", "Month", "Day","Hour"], axis=1)
print (df)
Zone 1 Zone 2 Zone 3 datetime
0 2 0 5 2014-01-01
1 3 1 2 2014-01-01
2 4 1 1 2014-01-01
df = df.groupby(["datetime"]).sum()
print (df)
Zone 1 Zone 2 Zone 3
datetime
2014-01-01 9 2 8
df = df['2014-08']
print (df)
Empty DataFrame
Columns: [Zone 1, Zone 2, Zone 3]
Index: []
用于过滤boolean indexing
:
df = df[df["Banana"] > 300]
推荐阅读
- mongodb - 查找按今天、本周、本月分组的文档数
- angular - ngfor 的正确数据格式
- sql - SQL - 使用特定的“order by”命令
- java - 在使用 orderByChild().equalTo() 读取/检索数据时
- c# - 保留/检索模型(列表)数据 - Razor Pages
- swift - 如何在覆盖另一个具有相同大小和位置的 UIView 的 UIView 上过滤和转发手势?
- reporting-services - 来自 SSRS 的 Asp .Net Core 下载报告
- javascript - 将敏感逻辑移出浏览器
- python - 如何在 django 的用户模型中将“移动”字段添加到默认 auth_user 表?
- networking - 分布式系统中的 P2P 和客户端-服务器架构模型有什么区别