gpt4 book ai didi

python - 在 Pandas 条件连接中保留左/右连接逻辑

转载 作者:太空宇宙 更新时间:2023-11-04 09:59:48 26 4
gpt4 key购买 nike

Pandas 目前不支持 SQL 意义上的条件连接;但是,可以通过在公共(public)字段上执行更大的连接然后在连接后处理上应用过滤器来模拟(性能较低)。

但是,我正在寻找一种通过此条件连接保留左(或右)元素的方法。我在后期处理中丢失了它们。

import pandas

# Create a dataframe
df = pandas.DataFrame([{'name': 'A', 'start': '20171201', 'end': '20180205'}, {'name': 'A', 'start': '20170901', 'end': '20170905'}, {'name': 'B', 'start': '20190101', 'end': '20190205'}])
df['start'] = pandas.to_datetime(df['start'])
df['end'] = pandas.to_datetime(df['end'])
print df


end name start
0 2018-02-05 A 2017-12-01
1 2017-09-05 A 2017-09-01
2 2019-02-05 B 2019-01-01



# Create another dataframe, don't want to lose any data here.
v_df = pandas.DataFrame([{'name': 'A', 'val': 10, 'date': '20180101'}, {'name': 'B', 'val': 20, 'date': '20170101'}])
v_df['date'] = pandas.to_datetime(v_df['date'])
print v_df

date name val
0 2018-01-01 A 10
1 2017-01-01 B 20



# Conditional Left Join both dataframes, want to avoid losing the name B val.
v_df = v_df.merge(df, how='left', on=['name'])
v_df = v_df[v_df['date'].between(v_df['start'], v_df['end'])]
print v_df


date name val end start
0 2018-01-01 A 10 2018-02-05 2017-12-01

在这种情况下所需的输出如下,其中包括来自 B 的 left 记录。

        date name  val        end      start
0 2018-01-01 A 10 2018-02-05 2017-12-01
2 2017-01-01 B 20 NaT NaT

当多个记录在一般合并中匹配时,解决方案还需要能够处理,但当没有该组匹配条件时,返回空记录(而不是根本没有记录)。

最佳答案

filter_df = df.merge(v_df)
filter_df = filter_df[filter_df['date'].between(filter_df['start'], filter_df['end'])]
v_df.merge(filter_df, how='left')

应该返回你想要的。filter_df 标识联接正确处理的行,您在问题中执行的操作,第二个合并将这些 startend 值附加到仅相关行。

编辑:

@MaxU 的答案在功能上是等效的,在语法上更优雅。

关于python - 在 Pandas 条件连接中保留左/右连接逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44204726/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com