发布于2019-10-27 16:46 阅读(4408) 评论(0) 点赞(30) 收藏(1)
我有一个熊猫数据框:
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['2005']
的a
。为此,我尝试了以下操作:
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
显然这是行不通的,因为熊猫在执行操作时正在整理索引。这有效:
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()
方法,但是减法仅适用于第一行,而我想从数据帧的每一行中减去第一行。
熊猫非常适合按索引对齐。因此,当您希望熊猫忽略索引时,您需要删除索引。您可以通过将DataFrame转换a.loc['2005']
为一维NumPy数组来实现:
In [56]: a - a.loc['2005'].values.squeeze()
Out[56]:
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 0.325968 1.314776 -0.789328 -0.344669 -2.518857 7.361711
2007-12-31 0.084203 2.234445 -2.838454 -6.176795 -3.645513 8.955443
2008-12-31 3.798700 0.299529 1.303325 -2.770126 -1.284188 3.093806
2009-12-31 1.520930 2.660040 0.846996 -9.437851 -2.886603 6.705391
该squeeze
方法将a.loc['2005']
shape 的NumPy数组转换为shape (1, 6)
的数组(6,)
。这允许根据需要广播该数组(在减法过程中)。
作者:黑洞官方问答小能手
链接:https://www.pythonheidong.com/blog/article/146688/227bc984934fb1625d01/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!