【问题标题】:python pandas "cannot set a row with mismatched columns" errorpython pandas“无法设置列不匹配的行”错误
【发布时间】:2018-12-01 10:43:29
【问题描述】:

我在向数据集中添加新行时遇到问题。

这里是DataFrame的例子。

column_names = ['A','B','C']
items = [['a1','b1','c1'],['a2','b2']]
newDF = pd.DataFrame(items,columns=column_names)
print(newDF)

输出:

    A   B     C
0  a1  b1    c1
1  a2  b2  None

由于缺少 c2,因此将其替换为 None。这很好,符合预期。

现在,如果我继续向现有的 DataFrame 添加类似的行,如下所示:

newDF.loc[len(newDF)] = ['a3','b3']

我收到错误“无法设置列不匹配的行”。

我怎样才能添加这个额外的行,以便它会自动处理缺少的带有None 或 NaN 的 c3?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    一个选项是DataFrame.append:

    >>> new_row = ['a3', 'b3']
    >>> newDF.append(pd.Series(new_row, index=newDF.columns[:len(new_row)]), ignore_index=True)
        A   B     C
    0  a1  b1    c1
    1  a2  b2  None
    2  a3  b3   NaN
    

    【讨论】:

      【解决方案2】:

      刚刚呢:

      >>> print(newDF)
          A   B     C
      0  a1  b1    c1
      1  a2  b2  None
      >>> newDF
          A   B     C
      0  a1  b1    c1
      1  a2  b2  None
      

      只需将新索引 2 与新值 a3 & b3 和最后一列放在一起。

      >>> newDF.loc['2'] = ['a3','b3', np.nan]
      >>> newDF
          A   B     C
      0  a1  b1    c1
      1  a2  b2  None
      2  a3  b3   NaN
      

      >>> row = ['a3','b3', np.nan]
      >>> newDF.loc['2'] = row
      >>> newDF
          A   B     C
      0  a1  b1    c1
      1  a2  b2  None
      2  a3  b3   NaN
      

      另一种方法:附加到 Dataframe,所需列的行中的新值,就像我们为 AB 所拥有的那样,它们的另一列将变为 NaN

      >>> row
      ['a3', 'b3']
      >>> newDF.append(pd.DataFrame([row],index=['2'],columns=['A', 'B']))
          A   B     C
      0  a1  b1    c1
      1  a2  b2  None
      2  a3  b3   NaN
      

      【讨论】:

      • 谢谢.. 我不想将索引/列名硬编码到代码中,因此遵循@timgeb 方法
      【解决方案3】:

      您将新行指定为字典并从中创建数据框。

      new_entry = {'A': ['a3'], 'B': ['b3']}
      new_entry_df=pd.DataFrame.from_dict(new_entry)
      

      现在可以将其附加到原始数据帧

      newDF.append(new_entry_df)
      
          A   B     C
      0  a1  b1    c1
      1  a2  b2  None
      0  a3  b3   NaN
      

      【讨论】:

      • 这会将newDF 的列名与新行的项目对齐。考虑new_entry = dict(zip(newDF.columns, ['a3', 'b3']))
      • 您还需要 ignore_index=TruenewDF.append 因为 OP 希望新行具有索引 2
      • @timgeb 但是如果我希望 a3 成为 C 列的值和 B 列的 b3 的值呢?
      • 在某些情况下,您需要手动指定新行的项目应该进入哪些列,在这种情况下,硬编码键是个好主意。然后是新行应该用 NaN 填充以适应数据框的情况。我认为后一种情况是 OP 所追求的。
      • 谢谢,就像@timgeb 提到的,我不想硬编码列名。我正在获取随机的动态数据,因此我无法对列名进行硬编码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      相关资源
      最近更新 更多