python - 使用条件连接语句加入 Pandas Dataframe

标签 python pandas dataframe join

我正在尝试使用以下数据连接两个数据框:

df1

df1

df2

df2

我想加入这两个数据框,条件是如果 df2 的“col2”为空白/NULL,那么加入应该只发生在 df1 的“column1”上和 df2 的 'col1' 但如果它是 not NULL/blank 那么连接应该在两个条件下发生,即 df1 的 'column1', 'column2' 分别为 df2 的 'col1', 'col2'。

作为引用,我希望获得的最终数据框是:

df3

我目前的方法是尝试将这 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/

相关文章:

python - 在图像模块 Python 中将 BMP 转换为灰度

python - 从 Pandas 中两列的文本的第二部分创建一列

Python pandas 时间序列重新采样给出了意想不到的结果

python - 将 pandas DataFrame 融入具有基于列的唯一键的字典中

xml - R中数据框的列表列表

python - 检查 Callable 对象是否是函数

Python 正则表达式数字和下划线

python - 在 SQLAlchemy 中, "filter"与 "join and filter"语法有什么区别?

pandas - 具有字典列表的列的pyarrow数据类型?

python - 快速将多列添加到 Pandas 数据框