我正在尝试使用以下数据连接两个数据框:
df1
df2
我想加入这两个数据框,条件是如果 df2 的“col2”为空白/NULL,那么加入应该只发生在 df1 的“column1”上和 df2 的 'col1' 但如果它是 not NULL/blank 那么连接应该在两个条件下发生,即 df1 的 'column1', 'column2' 分别为 df2 的 'col1', 'col2'。
作为引用,我希望获得的最终数据框是:
我目前的方法是尝试将这 2 个数据帧分成 4 个,然后根据条件分别加入它们。有没有什么方法可以在不切片的情况下做到这一点,或者我错过了更好的方法??
最佳答案
想法是rename
columns before left join before left join first and then replace missing value by matching by column1
, here is necessary by DataFrame.drop_duplicates
删除重复项之前 Series.map
col1
中的唯一值:
df22 = df2.rename(columns={'col1':'column1','col2':'column2'})
df = df1.merge(df22, on=['column1','column2'], how='left')
s = df2.drop_duplicates('col1').set_index('col1')['col3']
df['col3'] = df['col3'].fillna(df['column1'].map(s))
编辑:使用多列的一般解决方案 - 第一部分是相同的,使用左连接,第二部分使用 merge
一列与 DataFrame.combine_first
用于替换缺失值:
df22 = df2.rename(columns={'col1':'column1','col2':'column2'})
df = df1.merge(df22, on=['column1','column2'], how='left')
df23 = df22.drop_duplicates('column1').drop('column2', axis=1)
df = df.merge(df23, on='column1', how='left', suffixes=('','_'))
cols = df.columns[df.columns.str.endswith('_')]
df = df.combine_first(df[cols].rename(columns=lambda x: x.strip('_'))).drop(cols, axis=1)
关于python - 使用条件连接语句加入 Pandas Dataframe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63008278/