Python 这里正在执行什么减法运算?
我有一个带有许多列的Python 这里正在执行什么减法运算?,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个带有许多列的数据框,还有一个系列。两者都有相同的DateTimeIndex 数据帧: >>> print(df) AAPL GOOG MSFT AMZN FB 2018-01-01 NaN NaN NaN NaN NaN 2018-01-02 -0.667375 -1.567656 -1.161474 -
数据框
,还有一个系列
。两者都有相同的DateTimeIndex
数据帧
:
>>> print(df)
AAPL GOOG MSFT AMZN FB
2018-01-01 NaN NaN NaN NaN NaN
2018-01-02 -0.667375 -1.567656 -1.161474 -0.674142 -1.886490
2018-01-03 2.004473 -2.802214 -24.084166 -2.447172 2.346972
2018-01-04 -4.261619 -1.471697 -0.027939 -1.753661 -1.835053
2018-01-05 -1.008718 -2.816736 -1.524315 -1.001672 0.080345
2018-01-06 -30.325012 -1.056776 -1.190017 2319.212083 -1.847443
2018-01-07 0.497589 8.588272 -2.434537 -0.793424 -1.194649
2018-01-08 -1.650655 -0.583868 -10.141386 2.704900 7.449458
2018-01-09 1.821119 -6.742207 -0.710584 -0.003800 -1.535461
2018-01-10 -0.624853 0.030330 0.405643 -0.513841 -0.775323
>>> print(ser)
2018-01-01 NaN
2018-01-02 -1.191427
2018-01-03 -4.996421
2018-01-04 -1.869994
2018-01-05 -1.254219
2018-01-06 456.958567
2018-01-07 0.932650
2018-01-08 -0.444310
2018-01-09 -1.434187
2018-01-10 -0.295609
系列
:
>>> print(df)
AAPL GOOG MSFT AMZN FB
2018-01-01 NaN NaN NaN NaN NaN
2018-01-02 -0.667375 -1.567656 -1.161474 -0.674142 -1.886490
2018-01-03 2.004473 -2.802214 -24.084166 -2.447172 2.346972
2018-01-04 -4.261619 -1.471697 -0.027939 -1.753661 -1.835053
2018-01-05 -1.008718 -2.816736 -1.524315 -1.001672 0.080345
2018-01-06 -30.325012 -1.056776 -1.190017 2319.212083 -1.847443
2018-01-07 0.497589 8.588272 -2.434537 -0.793424 -1.194649
2018-01-08 -1.650655 -0.583868 -10.141386 2.704900 7.449458
2018-01-09 1.821119 -6.742207 -0.710584 -0.003800 -1.535461
2018-01-10 -0.624853 0.030330 0.405643 -0.513841 -0.775323
>>> print(ser)
2018-01-01 NaN
2018-01-02 -1.191427
2018-01-03 -4.996421
2018-01-04 -1.869994
2018-01-05 -1.254219
2018-01-06 456.958567
2018-01-07 0.932650
2018-01-08 -0.444310
2018-01-09 -1.434187
2018-01-10 -0.295609
如果我尝试从数据帧中减去序列,我会得到以下结果:
>>> df - ser
2018-01-01 00:00:00 2018-01-02 00:00:00 2018-01-03 00:00:00 \
2018-01-01 NaN NaN NaN
2018-01-02 NaN NaN NaN
2018-01-03 NaN NaN NaN
2018-01-04 NaN NaN NaN
2018-01-05 NaN NaN NaN
2018-01-06 NaN NaN NaN
2018-01-07 NaN NaN NaN
2018-01-08 NaN NaN NaN
2018-01-09 NaN NaN NaN
2018-01-10 NaN NaN NaN
2018-01-04 00:00:00 2018-01-05 00:00:00 2018-01-06 00:00:00 \
2018-01-01 NaN NaN NaN
2018-01-02 NaN NaN NaN
2018-01-03 NaN NaN NaN
2018-01-04 NaN NaN NaN
2018-01-05 NaN NaN NaN
2018-01-06 NaN NaN NaN
2018-01-07 NaN NaN NaN
2018-01-08 NaN NaN NaN
2018-01-09 NaN NaN NaN
2018-01-10 NaN NaN NaN
2018-01-07 00:00:00 2018-01-08 00:00:00 2018-01-09 00:00:00 \
2018-01-01 NaN NaN NaN
2018-01-02 NaN NaN NaN
2018-01-03 NaN NaN NaN
2018-01-04 NaN NaN NaN
2018-01-05 NaN NaN NaN
2018-01-06 NaN NaN NaN
2018-01-07 NaN NaN NaN
2018-01-08 NaN NaN NaN
2018-01-09 NaN NaN NaN
2018-01-10 NaN NaN NaN
2018-01-10 00:00:00 AAPL GOOG MSFT AMZN FB
2018-01-01 NaN NaN NaN NaN NaN NaN
2018-01-02 NaN NaN NaN NaN NaN NaN
2018-01-03 NaN NaN NaN NaN NaN NaN
2018-01-04 NaN NaN NaN NaN NaN NaN
2018-01-05 NaN NaN NaN NaN NaN NaN
2018-01-06 NaN NaN NaN NaN NaN NaN
2018-01-07 NaN NaN NaN NaN NaN NaN
2018-01-08 NaN NaN NaN NaN NaN NaN
2018-01-09 NaN NaN NaN NaN NaN NaN
2018-01-10 NaN NaN NaN NaN NaN NaN
我还收到以下警告:
我知道我可以使用
然而,我不知道的是:
- 使用
数据帧执行什么操作
- 此外,对我来说,用匹配的
索引
类型/内容从
数据帧
中减去
序列
并不能进行元素减法,这似乎是非常违反直觉的。不这样做的理由是什么
“列”
。这为我们提供了一个进行减法运算时会发生什么的提示,即:
df.sub(s) # by not specifying axis you are passing axis=1 / 'columns'
或
df - s
所有这些都不会像你想要的那样工作。现在让我们回顾一下黄色方框。另一种选择是'index'
,我们将匹配索引(听起来与您期望的完全一样),即:
为什么?这是一个设计问题。设计者也可以将
'index'
设置为默认值,但出于未知原因(可能是因为它使用频率更高,而且pandas后面的底层包numpy也以这种方式运行),他们选择了列。通过这样做,numpy行为很容易测试:df.values-s.values
,它确实在您感兴趣的列(索引)上运行
Short why:numpy是这样工作的
最优雅的解决方案是使用.sub()
并指定axis='index'
。(或0,但在这种情况下索引可能更可读)也许您可以使用查看调用了什么函数?
df.sub(s, axis=0) # or 'index' <-- note that you pass a param here
(df.T - s).T #swap columns and rows and swap back again (transpose)