【问题标题】:how to replace an entire column on Pandas.DataFrame如何替换 Pandas.DataFrame 上的整个列
【发布时间】:2021-10-06 17:31:18
【问题描述】:

我想用取自另一个 DataFrame 的另一列替换 Pandas DataFrame 上的一整列,一个示例将阐明我在寻找什么

import pandas as pd
dic = {'A': [1, 4, 1, 4], 'B': [9, 2, 5, 3], 'C': [0, 0, 5, 3]}
df = pd.DataFrame(dic)

df 是

'A' 'B' 'C'
 1   9   0
 4   2   0
 1   5   5
 4   3   3

现在我有另一个名为 df1 的数据框,其中有一列 "E"

df1['E'] = [ 4, 4, 4, 0]

我想将 df 的 "B" 列替换为 df1"E"

'A' 'E' 'C'
 1   4   0
 4   4   0
 1   4   5
 4   0   3

我尝试以多种方式使用.replace() 方法,但没有得到任何好处。你能帮帮我吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    如果索引匹配,则:

    df['B'] = df1['E']
    

    应该在其他情况下工作:

    df['B'] = df1['E'].values
    

    只要元素的长度匹配就可以工作

    【讨论】:

      【解决方案2】:

      如果您不介意返回一个新的数据框对象而不是更新原始的Pandas .assign() 将避免SettingWithCopyWarning。你的例子:

      df = df.assign(B=df1['E'])
      

      【讨论】:

      • 让我将这个答案扩展到一次替换多个列。这可以通过以下方式实现:df = df.assign(**df1.to_dict(orient='series')) :)
      • 此答案假定要更新的列的名称始终是有效的 Python 变量名称,一般情况下并非如此。但是,更一般的可以通过构造字典df = df.assign(**{'columnname':newvalues})
      • @MRule 非常感谢!我遇到了这个确切的问题,您的解决方案效果很好!
      【解决方案3】:

      对于那些遇到“SettingWithCopy”警告的人来说,这里有一个解决方法,它可能效率不高,但仍然可以完成工作。

      假设您要覆盖 column_1 和 column_3,但保留 column_2 和 column_4

      columns_to_overwrite = ["column_1", "column_3"]
      

      先删除要替换的列...

      original_df.drop(labels=columns_to_overwrite, axis="columns", inplace=True)
      

      ...然后重新插入列,但使用您打算覆盖的值

      original_df[columns_to_overwrite] = other_data_frame[columns_to_overwrite]
      

      【讨论】:

        【解决方案4】:

        简单地做:

        df.B = df1.E
        

        就是这样!

        【讨论】:

        • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
        猜你喜欢
        • 1970-01-01
        • 2015-11-14
        • 2021-03-06
        • 2020-07-06
        • 1970-01-01
        • 2012-03-14
        • 2020-10-26
        • 2021-10-28
        • 1970-01-01
        相关资源
        最近更新 更多