修改 一个简单的错误/错误导致了一些不可解释的问题。我编辑了这个问题,留下了实际可以解释的部分以及已经发布的答案。
我正在努力理解以下索引行为:
假设我有一些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
为什么会这样?
答案 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