I have a pandas dataframe:
a = pd.DataFrame(rand(5,6)*10, index=pd.DatetimeIndex(start='2005', periods=5, freq='A'))
a.columns = pd.MultiIndex.from_product([('A','B'),('a','b','c')])
我想要从
a
中减去行 a['2005']
。为了做到这一点,我尝试了以下方法:In [22]:
a - a.ix['2005']
Out[22]:
A B
a b c a b c
2005-12-31 0 0 0 0 0 0
2006-12-31 NaN NaN NaN NaN NaN NaN
2007-12-31 NaN NaN NaN NaN NaN NaN
2008-12-31 NaN NaN NaN NaN NaN NaN
2009-12-31 NaN NaN NaN NaN NaN NaN
显然这样做是不行的,因为在进行操作时pandas会将索引对齐。以下方法可以解决此问题:
In [24]:
pd.DataFrame(a.values - a['2005'].values, index=a.index, columns=a.columns)
Out[24]:
A B
a b c a b c
2005-12-31 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
2006-12-31 -3.326761 -7.164628 8.188518 -0.863177 0.519587 -3.281982
2007-12-31 3.529531 -4.719756 8.444488 1.355366 7.468361 -4.023797
2008-12-31 3.139185 -8.420257 1.465101 -2.942519 1.219060 -5.146019
2009-12-31 -3.459710 0.519435 -1.049617 -2.779370 4.792227 -1.922461
但我不想每次都要形成一个新的DataFrame来执行这种操作。我尝试了apply()方法,如下所示:
a.apply(lambda x: x-a['2005'].values)
但是我得到了ValueError: cannot copy sequence with size 6 to array axis with dimension 5
所以我真的不知道该怎么办。有没有一种简单的方法可以做到这一点,我没有看到?我认为应该有一种简单的方法可以在原地完成这个操作,这样您就不必每次构建一个新的数据框。我还尝试了sub()方法,但减法只应用于第一行,而我想从数据框中的每一行中减去第一行。