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  
我还收到以下警告:

我知道我可以使用

然而,我不知道的是:

  • 使用
    数据帧执行什么操作

  • 此外,对我来说,用匹配的
    索引
    类型/内容
    数据帧
    中减去
    序列
    并不能进行元素减法,这似乎是非常违反直觉的。不这样做的理由是什么


阅读您链接到的文档,我们发现:

轴:{0,1,'索引','列'}

对于系列输入,轴匹配上的系列索引

默认值为
“列”
。这为我们提供了一个进行减法运算时会发生什么的提示,即:

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)