我正在从几个空气质量监测站提取数据。每个站应记录相同的参数(例如O3、NO2、SO2 等)。我可以通过添加更多列将所有内容放入一个数据框中,但这变得很草率。
将数据放入多索引数据帧中是有意义的;但是,我想有选择地提取数据(例如,从站“A”提取数据,然后在指定的日期范围内截断,然后计算统计数据)。然而,我很难弄清楚如何截断多索引数据框,并开始相信这是不可能的。下面发布的是一个示例数据框,可以让您了解我正在处理的内容。
import pandas as pd
import numpy as np
dates = pd.date_range('20130101',periods=3,freq='5s')
dates = dates.append(dates)
locations = list('AAABBB')
gascode = ['no2','o3','so2']*2
tup = pd.MultiIndex.from_tuples( zip(locations,gascode,dates), names=['Location','gas','Date'] )
data = pd.DataFrame(data=range(6),index=tup,columns=['val1'])
>>> data
Location gas Date val1
A no2 2013-01-01 00:00:00 0
o3 2013-01-01 00:00:05 1
so2 2013-01-01 00:00:10 2
B no2 2013-01-01 00:00:00 3
o3 2013-01-01 00:00:05 4
so2 2013-01-01 00:00:10 5
通常我会将日期作为主(和唯一)索引,但这是不可行的,因为日期戳不是唯一的(即 O3、NO2 会有 2013-01-01 00:00:00 标记) ,SO2 等每个位置)。
是否可以通过三级索引截断?
我考虑过将数据转换为数据透视表,但我不认为这是最好的方法。在这种情况下,如果我可以解决日期问题,则多重索引最有意义。
最佳答案
多索引有一个隐含的层次结构的概念;如果您的计算倾向于打破这种层次结构,那么您最好不要使用多索引。至于您的示例,您可以通过不同的索引顺序来实现您想要的目的。也就是说,如果数据帧按 ['Location','Date','gas']
索引(按该顺序)
val1
Location Date gas
A 2013-01-01 00:00:00 no2 0
2013-01-01 00:00:05 o3 1
2013-01-01 00:00:10 so2 2
B 2013-01-01 00:00:00 no2 3
2013-01-01 00:00:05 o3 4
2013-01-01 00:00:10 so2 5
您可以使用ix
,如下所示:
df.ix[ 'A' ].ix[ pd.Timestamp( '2013-01-01 00:00:05' ):pd.Timestamp( '2013-01-01 00:00:10' )]
输出:
val1
Date gas
2013-01-01 00:00:05 o3 1
2013-01-01 00:00:10 so2 2
或者对于单列:
df.val1[ 'A' ][ pd.Timestamp( '2013-01-01 00:00:05' ):pd.Timestamp( '2013-01-01 00:00:10' )]
输出:
Date gas
2013-01-01 00:00:05 o3 1
2013-01-01 00:00:10 so2 2
Name: val1, dtype: int64
关于python-2.7 - 截断多索引数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20431617/