我的数据框df看起来像这样。日期和时间是2个多级索引
observation1 observation2
date Time
2012-11-02 9:15:00 79.373668 224
9:16:00 130.841316 477
2012-11-03 9:15:00 45.312814 835
9:16:00 123.776946 623
9:17:00 153.76646 624
9:18:00 463.276946 626
9:19:00 663.176934 622
9:20:00 763.77333 621
2012-11-04 9:15:00 115.449437 122
9:16:00 123.776946 555
9:17:00 153.76646 344
9:18:00 463.276946 212
我想对每日数据块做一些复杂的处理。
Psuedo代码看起来像
for count in df(level 0 index) :
new_df = get only chunk for count
complex_process(new_df)
所以,首先,我找不到只访问日期块的方法
2012-11-03 9:15:00 45.312814 835
9:16:00 123.776946 623
9:17:00 153.76646 624
9:18:00 463.276946 626
9:19:00 663.176934 622
9:20:00 763.77333 621
然后发送它进行处理。我在for循环中执行此操作,因为我不确定是否有任何方法可以在不提及0级列的确切值的情况下执行此操作。我做了一些基本的搜索并且能够获得df.index.get_level_values(0),但是它返回了我所有的值并且导致循环一天运行多次。我想每天创建一个数据帧并发送它进行处理。
答案 0 :(得分:66)
一种简单的方法是对索引的第一级进行分组 - 迭代groupby对象将返回组密钥和包含每个组的子帧。
In [136]: for date, new_df in df.groupby(level=0):
...: print(new_df)
...:
observation1 observation2
date Time
2012-11-02 9:15:00 79.373668 224
9:16:00 130.841316 477
observation1 observation2
date Time
2012-11-03 9:15:00 45.312814 835
9:16:00 123.776946 623
9:17:00 153.766460 624
9:18:00 463.276946 626
9:19:00 663.176934 622
9:20:00 763.773330 621
observation1 observation2
date Time
2012-11-04 9:15:00 115.449437 122
9:16:00 123.776946 555
9:17:00 153.766460 344
9:18:00 463.276946 212
答案 1 :(得分:6)
这个怎么样?
for idate in df.index.get_level_values('date'):
complex_process(df.ix[idate], idate)
答案 2 :(得分:1)
标记@psorenson答案,我们可以获得唯一级别索引及其相关数据框切片,而不是如下:
for date in df.index.get_level_values('date').unique():
print(df.loc[date])
答案 3 :(得分:1)
我迟到了聚会,我发现以下方法也适用:
for date in df.index.unique("date"):
print(df.loc[date])
它使用版本0.23.0中引入的Index.unique
method的level
可选参数。
您可以指定级别编号或标签。