我必须用另一个数据框的值替换一个数据框的值。
下面的示例可以工作,但是我要执行额外的步骤,以用“新”列中的值替换“第一”列中的值,然后删除“新”列。
In [1]: import pandas as pd
In [2]: df = pd.DataFrame([['A', 'X'],
...: ['B', 'X'],
...: ['C', 'X'],
...: ['A', 'Y'],
...: ['B', 'Y'],
...: ['C', 'Y'],
...: ], columns=['first', 'second'])
In [3]: df
Out[3]:
first second
0 A X
1 B X
2 C X
3 A Y
4 B Y
5 C Y
In [4]: df_tt = pd.DataFrame([['A', 'E'],
...: ['B', 'F'],
...: ], columns=['orig', 'new'])
In [5]: df_tt
Out[5]:
orig new
0 A E
1 B F
In [6]: df = df.merge(df_tt, left_on='first', right_on='orig')
In [7]: df
Out[7]:
first second orig new
0 A X A E
1 A Y A E
2 B X B F
3 B Y B F
In [8]: df['first'] = df['new']
In [9]: df
Out[9]:
first second orig new
0 E X A E
1 E Y A E
2 F X B F
3 F Y B F
In [10]: df.drop(columns=['orig', 'new'])
Out[10]:
first second
0 E X
1 E Y
2 F X
3 F Y
我想不做任何额外的操作即可替换值。
答案 0 :(得分:1)
使用isin
依次过滤boolean indexing
和map
:
df = (df[df['first'].isin(df_tt['orig'])]
.assign(first=lambda x: x['first'].map(df_tt.set_index('orig')['new'])))
print (df)
first second
0 E X
1 F X
3 E Y
4 F Y
替代:
df = df[df['first'].isin(df_tt['orig'])]
df['first'] = df['first'].map(df_tt.set_index('orig')['new'])
答案 1 :(得分:1)
另一种解决方案是使用replace:
# Restrict to common entries
df = df[df['first'].isin(df_tt['orig'])]
# Use df_tt as a mapping to replace values in df
df['first'] = df['first'].replace(df_tt.set_index('orig').to_dict()['new'])
解决方案与@jezrael非常相似,但是我喜欢显式使用replace
的想法,因为这实际上是您正在做的事情:基于另一个数据帧替换一个数据帧中的值。