将2D NumPy数组分配给Pandas DataFrame时出现意外行为

18

我有以下的代码:

x = pd.DataFrame(np.zeros((4, 1)), columns=['A'])
y = np.random.randn(4, 2)
x['A'] = y

我希望它因形状不匹配而抛出异常,但是pandas默默地接受了这个赋值操作: y的第一列被分配给x

这是一个有意的设计吗?如果是,背后的理由是什么?

我尝试过pandas 0.21和0.23。


感谢那些尝试帮助的人。然而,即使悬赏即将到期,没有人给出令人满意的答案。

让我强调一下预期的回答:

  1. 这种设计是否有意?它是一个bug吗?还是虚假的设计?
  2. 设计它的理由是什么?

由于悬赏即将到期,我接受了得票最多的答案。但它并没有回答上述问题。


似乎'A'已经是一列的特殊情况。例如,x['B'] = y会给出预期的ValueError: Wrong number of items passed 2, placement implies 1错误提示。 - ALollz
我希望这会引发关键错误,而不是... - doraemon
哦,是的,还有一个。 - ALollz
我认为目前情况仍不明确。基于此,我认为不应有一个被接受的答案。我在pandas代码库中提出了一个问题,看起来这可能是一个bug。 - Socob
3个回答

5
y中的值是未索引的矩阵。在这里,x['A'] = y的情况起作用,因为它取出矩阵中的第一个项目并将其分配给'A'
同样地,
x = pd.DataFrame(np.zeros((4, 2)), columns=['A', 'B'])
y = np.random.randn(4, 2)
x[['A', 'B']] = y

如果您想传递更少的列,可以使用以下代码,因为 pandas 会自动丢弃多余的数据。

x = pd.DataFrame(np.zeros((4, 2)), columns=['A', 'B'])
y = np.random.randn(4, 1)
x[['A', 'B']] = y

这也可以正常工作,因为它将把相同的值分配给两列。这种情况类似于x ['A'] = 0,它会用零替换列A中的所有数据。


“未索引矩阵”是什么意思?y的第一项是什么?第一列吗? - doraemon
@LiuSha 数据框(Dataframe)和序列(Series)都有索引。由于np.random.randn是一个列表的列表,因此它没有索引。 - yogkm

-1

对于

x = pd.DataFrame(np.zeros((4, 1)), columns=['A'])
y = np.random.randn(4, 2)

如果 x['A'] = y,则列会被复制,如果我们使用不同的列长度进行迭代:

x = pd.DataFrame(np.zeros((4, 3)), columns=['A','B','C'])
y = np.random.randn(4, 2)

当尝试 x['A'] = y 时,第一列也被复制。但是,如果我们将 x = y 进行等式运算,那么 x 数据帧会被 y 矩阵复制。 所以我猜想,由于我们正在尝试将数据帧的列与 numpy 中创建的矩阵进行等式运算,所以出现了这种模棱两可的情况。 希望能解释清楚。


-1

Pandas系列是numpy数组,由于它只有一列,因此将其视为一个对象,引用已更改。

>> import numpy as np
>>> x = np.zeros((4,1))
>>> x = np.random.randn(4,2)
>>> y= np.zeros((4,1))
>>> y
array([[0.],
       [0.],
       [0.],
       [0.]])
>>> x
array([[-1.00731291, -0.37151425],
       [-0.78154847, -0.72854126],
       [-0.98566253,  1.68786232],
       [ 0.12614892,  0.41804799]])
>>> y = x
>>>y
array([[-1.00731291, -0.37151425],
       [-0.78154847, -0.72854126],
       [-0.98566253,  1.68786232],
       [ 0.12614892,  0.41804799]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接