gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:44:52 28 4
gpt4 key购买 nike

我有一个 Pandas 数据框:

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() 方法,但减法仅应用于第一行,而我想从数据框中的每一行中减去第一行。

最佳答案

Pandas 非常适合按索引对齐。所以当你想让 Pandas 忽略索引时,你需要删除索引。您可以通过转换 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 method转换 NumPy 数组,a.loc['2005'] , 形状为 (1, 6)到形状数组 (6,) .这允许根据需要广播数组(在减法期间)。

关于python - 从 Pandas DataFrame 中的所有行中减去第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24370711/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com