如何替换Pandas.DataFrame上的整个列

Ste*_*ele 22 python pandas

我想用另一个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)
Run Code Online (Sandbox Code Playgroud)

df是

'A' 'B' 'C'
 1   9   0
 4   2   0
 1   5   5
 4   3   3
Run Code Online (Sandbox Code Playgroud)

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

df1['E'] = [ 4, 4, 4, 0]
Run Code Online (Sandbox Code Playgroud)

我想用df1的列"E"替换df的列"B"

'A' 'E' 'C'
 1   4   0
 4   4   0
 1   4   5
 4   0   3
Run Code Online (Sandbox Code Playgroud)

我试图在很多方面使用.replace()方法,但我没有得到任何好处.你能帮助我吗?

EdC*_*ica 37

如果指数匹配则:

df['B'] = df1['E']
Run Code Online (Sandbox Code Playgroud)

否则应该工作:

df['B'] = df1['E'].values
Run Code Online (Sandbox Code Playgroud)

只要元素的长度匹配,它就会起作用

  • 我使用此方法收到以下警告:“SettingWithCopyWarning:正在尝试在 DataFrame 切片的副本上设置值。” (6认同)
  • 这会产生一个`SettingWithCopyWarning` :( (4认同)

Jam*_*mbe 20

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

df = df.assign(B=df1['E'])
Run Code Online (Sandbox Code Playgroud)

  • 此答案假设要更新的列的名称始终是有效的 Python 变量名称,但通常情况并非如此。但是,更一般地,它可以通过构造字典 `df = df.assign(**{'columnname':newvalues})` 来传递 (4认同)
  • 让我将这个答案扩展到一次替换多个列。这可以通过以下方式实现: `df = df.assign(**df1.to_dict(orient='series'))` :) (2认同)

Che*_*ge 8

对于那些因“SettingWithCopy”警告而苦恼的人,这里有一个可能效率不高但仍能完成工作的解决方法。

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

columns_to_overwrite = ["column_1", "column_3"]
Run Code Online (Sandbox Code Playgroud)

首先删除要替换的列...

original_df.drop(labels=columns_to_overwrite, axis="columns", inplace=True)
Run Code Online (Sandbox Code Playgroud)

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

original_df[columns_to_overwrite] = other_data_frame[columns_to_overwrite]
Run Code Online (Sandbox Code Playgroud)


小智 3

只需执行以下操作:

df.B = df1.E
Run Code Online (Sandbox Code Playgroud)

就这样!

  • 通过额外的支持信息可以改进您的答案。请[编辑]添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以[在帮助中心](/help/how-to-answer)找到有关如何写出好的答案的更多信息。 (2认同)