首页 > 解决方案 > 按索引列过滤分组数据集

问题描述

我正在尝试完成 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 说我没有传递一个可迭代对象,所以我猜它需要在那里,即使我不完全理解为什么(我认为过滤器只会应用我传递的函数到分组中的每个组。)

我不知道如何解决这个问题,因为我不明白我做错了什么。

标签: pythonpandasdataframe

解决方案


使用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]

推荐阅读