意外的大熊猫广播行为

时间:2017-06-29 11:11:22

标签: python pandas indexing

修改 一个简单的错误/错误导致了一些不可解释的问题。我编辑了这个问题,留下了实际可以解释的部分以及已经发布的答案。

我正在努力理解以下索引行为: 假设我有一些pd.DataFrame

In [18]: Df = pd.DataFrame(zip(list('abcde'),sp.randn(5)),index=range(5),columns=['label','val'])

In [19]: Df
Out[19]: 
  label       val
0     a -0.705392
1     b  0.087682
2     c  1.519180
3     d  1.363852
4     e -0.004182

我正试图将其中一个val的所有值标准化,比如c。 直觉我会写

Df['val'] / Df.loc[Df['label'] == 'c']['val']

但结果会引发一些我不完全理解的广播行为:

In [20]: Df['val'] / Df.loc[Df['label'] == 'c']['val']
Out[20]: 
0    NaN
1    NaN
2    1.0
3    NaN
4    NaN
Name: val, dtype: float64

为什么会这样?

2 个答案:

答案 0 :(得分:3)

您将Series除以Series,这导致pandas在索引上对齐。如果你看一下通过索引产生的值:

df.loc[df['label'] == 'c']['val']
2    1.51918
Name: val, dtype: float64

...你会看到这是Series。如果您进一步索引此Series

df.loc[df['label'] == 'c']['val'][2]
1.51918

...我们现在离开:

type(df.loc[df['label'] == 'c']['val'][2])
<class 'numpy.float64'>

如果我们尝试将整个val系列划分为:

df.val / df.loc[df['label'] == 'c']['val'][2]
0   -0.464324
1    0.057717
2    1.000000
3    0.897755
4   -0.002753
Name: val, dtype: float64

......我们有预期的行为。

请注意,这种凌乱的链式索引不是你应该如何将整个Series除以奇异值......

答案 1 :(得分:0)

[我认为这里发生的事情是你不允许直接通过其他系列划分系列 - 通过/运算符。这有一个pandas.Series.divide功能。] 编辑:显然你可以而且我很蠢。

如果您将Df.loc[Df['label'] == 'c']['val']转换为浮点数,那么将系列对象划分为没有问题:

foo = float(Df.loc[Df['label'] == 'c']['val'])
Df['val'] / foo