程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

从Pandas DataFrame中的所有行中减去第一行

发布于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黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

30 0
收藏该文
已收藏

评论内容:(最多支持255个字符)