编辑: 一个简单的错误/错误导致了一些无法解释的问题。我编辑了问题,留下了实际上可以解释的部分,并且已经发布了答案。
我正在努力理解以下索引行为:
假设我有一些 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
为什么会发生这种情况?
最佳答案
您将 Series
除以 Series
,这会导致 pandas 在索引上对齐。如果您查看通过索引产生的值:
df.loc[df['label'] == 'c']['val']
2 1.51918
Name: val, dtype: float64
...您会看到这是一个系列
。如果您进一步索引此系列
:
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
的方式...
关于python - 意外的 pandas 广播行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44823534/