python - 意外的 pandas 广播行为

标签 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

为什么会发生这种情况?

最佳答案

您将 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/

相关文章:

python - 鉴于任何纬度,长。坐标,在列表中找到最近坐标的最快方法是什么?

mysql - 索引和连接

python - 为 db tableD Django 创建别名

python/flask/Jinja2 和 Json

python - 如何在gcloud python客户端中按标签过滤

python - 在一张图中绘制两条曲线时遇到错误(python-pandas-matplotlib)

pandas - 选择可以在列表中找到数字的行

散列VS索引

mysql - 复合 where 子句的顺序(MySQL、Postgres)

Python 将IP转换为八进制地址