Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在具有多索引的数据帧的单个级别上迭代和应用函数?_Python_Pandas - Fatal编程技术网

Python 如何在具有多索引的数据帧的单个级别上迭代和应用函数?

Python 如何在具有多索引的数据帧的单个级别上迭代和应用函数?,python,pandas,Python,Pandas,由于对my的响应,我现在有了一个我想要的多索引数据帧。现在我已经有了数据结构中的数据,我正试图把它拿出来,想知道是否有更好的方法来实现这一点。我的两个问题是相关的,但可能有不同的“理想”解决方案: 示例数据帧(已截断) 迭代 我希望能够在这个数据帧上循环,在这个数据帧上,迭代只会降低一个索引维度,即iteritems行为,它将返回[('iwgcw',df['iwgcw']),('iwgdw',df['iwgdw'])],并产生两个带有提前期列的数据帧。我的强力解决方案是使用一个包装器例程,它基本

由于对my的响应,我现在有了一个我想要的多索引数据帧。现在我已经有了数据结构中的数据,我正试图把它拿出来,想知道是否有更好的方法来实现这一点。我的两个问题是相关的,但可能有不同的“理想”解决方案:

示例数据帧(已截断)

迭代

我希望能够在这个数据帧上循环,在这个数据帧上,迭代只会降低一个索引维度,即
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