Python 如何在具有多索引的数据帧的单个级别上迭代和应用函数?
由于对my的响应,我现在有了一个我想要的多索引数据帧。现在我已经有了数据结构中的数据,我正试图把它拿出来,想知道是否有更好的方法来实现这一点。我的两个问题是相关的,但可能有不同的“理想”解决方案: 示例数据帧(已截断) 迭代 我希望能够在这个数据帧上循环,在这个数据帧上,迭代只会降低一个索引维度,即Python 如何在具有多索引的数据帧的单个级别上迭代和应用函数?,python,pandas,Python,Pandas,由于对my的响应,我现在有了一个我想要的多索引数据帧。现在我已经有了数据结构中的数据,我正试图把它拿出来,想知道是否有更好的方法来实现这一点。我的两个问题是相关的,但可能有不同的“理想”解决方案: 示例数据帧(已截断) 迭代 我希望能够在这个数据帧上循环,在这个数据帧上,迭代只会降低一个索引维度,即iteritems行为,它将返回[('iwgcw',df['iwgcw']),('iwgdw',df['iwgdw'])],并产生两个带有提前期列的数据帧。我的强力解决方案是使用一个包装器例程,它基本
iteritems
行为,它将返回[('iwgcw',df['iwgcw']),('iwgdw',df['iwgdw'])]
,并产生两个带有提前期列的数据帧。我的强力解决方案是使用一个包装器例程,它基本上执行[(key,df[key]for key in df.columns.levels[0]]
。有更好的方法吗
应用
我还想做一些事情,比如“从其他所有人中减去IWWGDW条目”来计算成对的差异。我试图做
df.apply(lambda f:f-df['IWGDW'])
但是得到一个KeyError:('IWWGDW','发生在索引2010-11-26 12:00:00')
无论我使用的是axis=1
还是axis=0
。我尝试过使用上面提到的迭代解决方案重建一个新的数据帧,但我总是担心当我使用暴力时。有没有更“泛基本”的方法来进行这种计算?我建议使用groupby进行迭代:
In [25]: for exp, group in df.groupby(level=0, axis=1):
....: print exp, group
....:
IWWGCW Experiment IWWGCW
Lead Time 24 48
2010-11-27 12:00:00 0.997 0.991
2010-11-28 12:00:00 0.998 0.987
2010-11-29 12:00:00 0.997 0.992
2010-11-30 12:00:00 0.997 0.987
2010-12-01 12:00:00 0.996 0.986
IWWGDW Experiment IWWGDW
Lead Time 24 48
2010-11-27 12:00:00 0.998 0.990
2010-11-28 12:00:00 0.997 0.990
2010-11-29 12:00:00 0.997 0.992
2010-11-30 12:00:00 0.997 0.987
2010-12-01 12:00:00 0.996 0.986
但是,我发现这并不会像您所寻找的那样降低顶层。理想情况下,您可以编写如下内容:
df.groupby(level=0,axis=1).sub(df['iwgcw'])
让它进行成对减法,但由于df['iwgcw']
降低了级别,列名不会对齐。尽管如此:
In [29]: df.groupby(level=0, axis=1).sub(df['IWWGCW'].values)
Out[29]:
Experiment IWWGCW IWWGDW
Lead Time 24 48 24 48
2010-11-27 12:00:00 0 0 0.001 -0.001
2010-11-28 12:00:00 0 0 -0.001 0.003
2010-11-29 12:00:00 0 0 0.000 0.000
2010-11-30 12:00:00 0 0 0.000 0.000
2010-12-01 12:00:00 0 0 0.000 0.000
我会再考虑一下。我知道这是一个很老的问题,但是按照@WesMcKinney的回答,我发现在循环中最好的方法就是立即选择它,比如:
for exp, group in df.groupby(level=0, axis=1):
print(group[exp])
Lead Time 24 48
2010-11-27 12:00:00 0.997 0.991
2010-11-28 12:00:00 0.998 0.987
2010-11-29 12:00:00 0.997 0.992
2010-11-30 12:00:00 0.997 0.987
2010-12-01 12:00:00 0.996 0.986
这将正确返回底层的
DataFrame
,我只是编写了一个循环,还需要进一步考虑这个问题。@TimWhitcomb我正在尝试做类似的事情,将数据添加到多索引数据帧中。您在这方面有进一步的改进吗?
for exp, group in df.groupby(level=0, axis=1):
print(group[exp])
Lead Time 24 48
2010-11-27 12:00:00 0.997 0.991
2010-11-28 12:00:00 0.998 0.987
2010-11-29 12:00:00 0.997 0.992
2010-11-30 12:00:00 0.997 0.987
2010-12-01 12:00:00 0.996 0.986