【问题标题】:Assigning to a slice from another DataFrame requires matching column names?从另一个 DataFrame 分配给切片需要匹配的列名?
【发布时间】:2018-07-14 03:13:14
【问题描述】:

如果我想用另一个数据帧的值设置(替换)一部分,我应该能够像这样分配给一个切片(如question):

df.loc[rows, cols] = df2

在这种情况下不是这样,而是将切片归零:

In [32]: df
Out[32]: 
   A         B
0  1 -0.240180
1  2 -0.012547
2  3 -0.301475

In [33]: df2
Out[33]: 
   C
0  x
1  y
2  z

In [34]: df.loc[:,'B']=df2

In [35]: df
Out[35]: 
   A   B
0  1 NaN
1  2 NaN
2  3 NaN

但它只适用于df2 中的一列(系列),如果我想要多个列,这不是一个选项:

In [36]: df.loc[:,'B']=df2['C']

In [37]: df
Out[37]: 
   A  B
0  1  x
1  2  y
2  3  z

或者如果列名匹配:

In [47]: df3
Out[47]: 
   B
0  w
1  a
2  t

In [48]: df.loc[:,'B']=df3

In [49]: df
Out[49]: 
   A  B
0  1  w
1  2  a
2  3  t

这是预期的吗?我在文档或 Stackoverflow 中没有看到任何解释。

【问题讨论】:

    标签: pandas dataframe slice


    【解决方案1】:

    你可以使用底层的 NumPy 数组:

    df.loc[:,'B'] = df2.values
    
    df
       A  B
    0  1  x
    1  2  y
    2  3  z
    

    Pandas 索引总是对行和列的标签敏感。在这种情况下,您的行会签出,但您的列不会签出。 (B != C)。

    使用底层 NumPy 数组使操作对索引不敏感。

    df2 是一个系列时,这个确实起作用的原因是因为系列没有列的概念。唯一的对齐方式是对齐的行。

    【讨论】:

      【解决方案2】:

      是的,这是意料之中的。标签对齐是 pandas 的核心功能之一。当您使用df.loc[:,'B'] = df2 时,它需要对齐两个DataFrame:

      df.align(df2)
      Out: 
      (   A         B   C
       0  1 -0.240180 NaN
       1  2 -0.012547 NaN
       2  3 -0.301475 NaN,     A   B  C
       0 NaN NaN  x
       1 NaN NaN  y
       2 NaN NaN  z)
      

      上面显示了每个 DataFrame 在作为元组对齐时的外观(第一个是 df,第二个是 df2)。如果您的 df2 也有一个名为 B 且值为 [1, 2, 3] 的列,它将变为:

      df.align(df2)
      Out: 
      (   A         B   C
       0  1 -0.240180 NaN
       1  2 -0.012547 NaN
       2  3 -0.301475 NaN,     A  B  C
       0 NaN  1  x
       1 NaN  2  y
       2 NaN  3  z)
      

      由于 B 是对齐的,因此您的分配将导致

      df.loc[:,'B'] = df2
      
      df
      Out: 
         A  B
      0  1  1
      1  2  2
      2  3  3
      

      当您使用系列时,对齐将在单个轴上(在您的示例中位于索引上)。由于它们完全匹配,所以不会有问题,它会将值从df2['C'] 分配给df['B']

      您可以在对齐之前重命名标签,也可以使用没有标签的数据结构(numpy 数组、列表、元组...)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-15
        • 2013-05-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多