使用每个单元格中的子字符串比较两个数据帧,如果数据位于第二个数据帧中的相应位置,则将数据保留在第一个数据帧中

Compare two dataframes using substrings in each cell, keep data in first dataframe if it is in corresponding spot in second dataframe

我有两个数据框。两者具有相同的索引和相同的列标签。我想通过子字符串和单元格位置来比较它们。

data_1 = {'column A': ['AA (1)', 'nan', 'nan', 'DD (6)', 'nan'], 
          'column B': ['AA (8)', 'nan', 'CC (3)', 'nan', 'nan'], 
          'column C': ['AA (9)', 'nan', 'CC (7)', 'DD (5)', 'nan']}  
df_1 = pd.DataFrame(data_1)  
data_2 = {'column A': ['AA', 'BB', 'nan', 'nan', 'nan'], 
          'column B': ['nan', 'nan', 'CC', 'nan', 'EE'], 
          'column C': ['nan', 'BB', 'CC', 'DD', 'nan']}  
df_2 = pd.DataFrame(data_2)  

假设前两个字符相同且位于第二个数据框中的相同位置,第一个数据框包含我要保留的数据。例如,比较两个数据帧之间的 'column A'。仅在第一列中保留 'AA (1)',因为 'AA' 子字符串在两个数据框中且位于同一位置,但删除 'DD (6)'.

这是所需的输出:

data_3 = {'column A': ['AA (1)', 'nan', 'nan', 'nan', 'nan'], 
          'column B': ['nan', 'nan', 'CC (3)', 'nan', 'nan'], 
          'column C': ['nan', 'nan', 'CC (7)', 'DD (5)', 'nan']}  
df_3 = pd.DataFrame(data_3)
def match(df_11, df_2):
    new_df = pd.DataFrame([])
    concat_df = pd.concat([df_1, df_2], axis=1)
    for i in df_1.columns:
        new_df[i] = concat_df[i].apply(
            lambda x: ['nan', x[0]][x[1].startswith(x[0][:2])], axis=1)
    return new_df


df_3 = match(df_1, df_2)
print(df_3)