Сравните 2 разных кадра данных, имеющих почти одинаковые значения, и обновите старые с новыми данными, используя панды - PullRequest
0 голосов
/ 05 июня 2018

У меня есть фрейм данных

df1_master =

col_A  col_B  col_C     col_D   col_E 
 AA    abcd   1_00_11      x     y
 AB    efgh   1_11_55      x     y
 AC    abcd   2_23_55      x     y
 AD    abdf   3_00_34      x     y

Case2: df1_master

col_A  col_B  col_C  col_D  col_E 

фрейм данных с новыми значениями

df2_newValues =    
 A1col    A2col              
 AA       1_00_23      
 AB       1_11_24      
 AC       2_23_55     
 AD       3_00_34
 AE       4_22_33    
 AF       6_45_65  

Ожидаетсяoutput

df1_master=       
col_A  col_B  col_C     col_D   col_E 
 AA    abcd   1_00_23      x     y
 AB    efgh   1_11_24      x     y
 AC    abcd   2_23_55      x     y
 AD    abdf   3_00_34      x     y
 AE    Nan    4_22_33      Nan   Nan
 AF    Nan    6_45_65      Nan   Nan

Мне нужно обновить master df новыми значениями, а также добавить новые строки, если они есть.Не могли бы вы помочь мне найти решение?

Ответы [ 4 ]

0 голосов
/ 05 июня 2018

Попробуйте использовать combine_first

df1=df1.set_index('col_A')
df2.rename(columns = {'A1col':'col_A', 'A2col':'col_C'}).set_index('col_A').combine_first(df1)
Out[460]: 
      col_B    col_C
col_A               
AA     abcd  1_00_23
AB     efgh  1_11_24
AC     abcd  2_23_55
AD     abdf  3_00_34
AE      NaN  4_22_33
AF      NaN  6_45_65
0 голосов
/ 05 июня 2018

объедините два кадра данных, выберите нужные столбцы и переименуйте их, чтобы они соответствовали исходным именам.

df1_master = df2_newValues.merge(
      df1_master, 
      how='left', 
      left_on='A1col', 
      right_on='col_A'
).iloc[:,[0,3,1]].rename(
      {'A1col': 'col_A', 
       'A2col': 'col_C'},
axis=1)

outputs:

  col_A col_B    col_C
0    AA  abcd  1_00_23
1    AB  efgh  1_11_24
2    AC  abcd  2_23_55
3    AD  abdf  3_00_34
4    AE   NaN  4_22_33
5    AF   NaN  6_45_65

update:

, чтобы включить дополнительные столбцы изпервый фрейм данных, включая их позиционный индекс или имя столбца,

, т.е. в приведенном выше выражении замените iloc[:,[0,3,1]] на iloc[:[0,3,1,5,6]] или loc[:,['A1col', 'col_B', 'A2col', 'col_D','col_E']]

    col_A  col_B  col_C     col_D   col_E 
0     AA    abcd   1_00_23      x     y
1     AB    efgh   1_11_24      x     y
2     AC    abcd   2_23_55      x     y
3     AD    abdf   3_00_34      x     y
4     AE    Nan    4_22_33      Nan   Nan
5     AF    Nan    6_45_65      Nan   Nan
0 голосов
/ 05 июня 2018

Попробуйте следующее:

merged_df = pd.merge(df1_master, df2_newValues, left_on='col_A', 
            right_on='A1col', how='outer')
merged_df.A2col.fillna(merged_df.col_C, inplace=True)
merged_df.col_A.fillna(merged_df.A1col, inplace=True)
merged_df = merged_df.drop(['col_C','A1col'], axis=1)
merged_df.columns=['col_A','col_B','col_C']
merged_df
0 голосов
/ 05 июня 2018

одно решение - использовать merge на вашем df1_master только для col_A и col_B с df2_newValues после переименования столбца, используя how = 'outer', чтобы сохранить все возможные строки:

df2_newValues = df2_newValues.rename(columns = {'A1col':'col_A', 'A2col':'col_C'})
df_output = df1_master[['col_A', 'col_B']].merge(df2_newValues, on = 'col_A', 
                                                 how='outer')
#and fill missing value of the col_C with old value:
df_output['col_C'] = df_output['col_C'].fillna(df1_master['col_C'])
#and if you want to call it 
df1_master = df_output
...