用另一个数据框中的值替换一个熊猫数据框中的值

时间:2019-02-06 08:39:54

标签: python pandas merge

我必须用另一个数据框的值替换一个数据框的值。

下面的示例可以工作,但是我要执行额外的步骤,以用“新”列中的值替换“第一”列中的值,然后删除“新”列。

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

我想不做任何额外的操作即可替换值。

2 个答案:

答案 0 :(得分:1)

使用isin依次过滤boolean indexingmap

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的想法,因为这实际上是您正在做的事情:基于另一个数据帧替换一个数据帧中的值。

相关问题