如何在 Pandas 合并操作期间应用过滤条件但将它们保留在结果 DF 中?
How to apply filter condition during Pandas Merge operation but retain them in the result DF?
我正在尝试用 pandas 做一些等同于以下 SQL 命令的事情:
select *
from tableA as A
left join tableB as B
on A.key = B.key and substr(A.value,1,2) not in ('something', 'something else')
正如您在上面的 sql 查询中看到的,A.value 在连接期间应用了过滤条件,但由于它是左连接,不在条件中的条件不会持续到结果数据集,它仅在连接操作期间适用,这样连接操作将不会考虑满足 A.value 不在 ('something', 'something else') 条件中的任何行。
我尝试了以下 python 代码,但它导致从结果数据集中过滤掉 A.value 行,我需要通过左连接的所有行,但我不想要a.value not in 条件指定的行的合并操作,就像上面的 SQL 语句逻辑一样。
df_output = df_input1[~df_input1['value'].str[:2].isin(['something', 'something_else'])].merge(df_input2, left_on = 'key', right_on = 'key', how='left')
提前谢谢大家!
有点老套,但我的想法是创建一个新列用于加入 df1,并且只为要合并的行填写此列:
import pandas as pd
df_input1 = pd.DataFrame({
'fruit':['apple','banana','mango'],
'quantity':[3,4,5],
})
df_input2 = pd.DataFrame({
'fruit':['apple','banana','mango'],
'in_stock':[True,False,True],
})
minimum_quantity = 4
ind = df_input1['quantity'].ge(minimum_quantity)
df_input1.loc[ind, 'merge_column'] = df_input1.loc[ind, 'fruit']
merge_filtered_fruits = df_input1.merge(
df_input2,
left_on = 'merge_column',
right_on = 'fruit',
how = 'left'
).drop(columns=['merge_column'])
print(merge_filtered_fruits)
输出:
fruit_x quantity fruit_y in_stock
0 apple 3 NaN NaN
1 banana 4 banana False
2 mango 5 mango True
我很好奇有什么更好的方法
我正在尝试用 pandas 做一些等同于以下 SQL 命令的事情:
select *
from tableA as A
left join tableB as B
on A.key = B.key and substr(A.value,1,2) not in ('something', 'something else')
正如您在上面的 sql 查询中看到的,A.value 在连接期间应用了过滤条件,但由于它是左连接,不在条件中的条件不会持续到结果数据集,它仅在连接操作期间适用,这样连接操作将不会考虑满足 A.value 不在 ('something', 'something else') 条件中的任何行。
我尝试了以下 python 代码,但它导致从结果数据集中过滤掉 A.value 行,我需要通过左连接的所有行,但我不想要a.value not in 条件指定的行的合并操作,就像上面的 SQL 语句逻辑一样。
df_output = df_input1[~df_input1['value'].str[:2].isin(['something', 'something_else'])].merge(df_input2, left_on = 'key', right_on = 'key', how='left')
提前谢谢大家!
有点老套,但我的想法是创建一个新列用于加入 df1,并且只为要合并的行填写此列:
import pandas as pd
df_input1 = pd.DataFrame({
'fruit':['apple','banana','mango'],
'quantity':[3,4,5],
})
df_input2 = pd.DataFrame({
'fruit':['apple','banana','mango'],
'in_stock':[True,False,True],
})
minimum_quantity = 4
ind = df_input1['quantity'].ge(minimum_quantity)
df_input1.loc[ind, 'merge_column'] = df_input1.loc[ind, 'fruit']
merge_filtered_fruits = df_input1.merge(
df_input2,
left_on = 'merge_column',
right_on = 'fruit',
how = 'left'
).drop(columns=['merge_column'])
print(merge_filtered_fruits)
输出:
fruit_x quantity fruit_y in_stock
0 apple 3 NaN NaN
1 banana 4 banana False
2 mango 5 mango True
我很好奇有什么更好的方法