python - 合并一个值介于两个其他值之间的 Pandas 数据框

标签 python pandas join timespan date-range

我需要在一个标识符上合并两个 pandas 数据帧,以及一个数据帧中的日期介于另一个数据帧中的两个日期之间的条件。

数据框 A 有一个日期(“fdate”)和一个 ID(“cusip”):

enter image description here

我需要将它与这个数据框 B 合并:

enter image description here

关于 A.cusip==B.ncusipA.fdateB.namedtB.nameenddt

在 SQL 中这将是微不足道的,但我可以看到如何在 pandas 中执行此操作的唯一方法是首先无条件地合并标识符,然后过滤日期条件:

df = pd.merge(A, B, how='inner', left_on='cusip', right_on='ncusip')
df = df[(df['fdate']>=df['namedt']) & (df['fdate']<=df['nameenddt'])]

这真的是最好的方法吗?如果可以在合并中进行过滤,以避免在合并之后但在过滤完成之前出现可能非常大的数据帧,似乎会好得多。

最佳答案

正如你所说,这在 SQL 中很容易,为什么不在 SQL 中做呢?

import pandas as pd
import sqlite3

#We'll use firelynx's tables:
presidents = pd.DataFrame({"name": ["Bush", "Obama", "Trump"],
                           "president_id":[43, 44, 45]})
terms = pd.DataFrame({'start_date': pd.date_range('2001-01-20', periods=5, freq='48M'),
                      'end_date': pd.date_range('2005-01-21', periods=5, freq='48M'),
                      'president_id': [43, 43, 44, 44, 45]})
war_declarations = pd.DataFrame({"date": [datetime(2001, 9, 14), datetime(2003, 3, 3)],
                                 "name": ["War in Afghanistan", "Iraq War"]})
#Make the db in memory
conn = sqlite3.connect(':memory:')
#write the tables
terms.to_sql('terms', conn, index=False)
presidents.to_sql('presidents', conn, index=False)
war_declarations.to_sql('wars', conn, index=False)

qry = '''
    select  
        start_date PresTermStart,
        end_date PresTermEnd,
        wars.date WarStart,
        presidents.name Pres
    from
        terms join wars on
        date between start_date and end_date join presidents on
        terms.president_id = presidents.president_id
    '''
df = pd.read_sql_query(qry, conn)

df:

         PresTermStart          PresTermEnd             WarStart  Pres
0  2001-01-31 00:00:00  2005-01-31 00:00:00  2001-09-14 00:00:00  Bush
1  2001-01-31 00:00:00  2005-01-31 00:00:00  2003-03-03 00:00:00  Bush

关于python - 合并一个值介于两个其他值之间的 Pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30627968/

相关文章:

python - 返回行中 3 个最高值的列名称

mysql - 在另一个查询 MySQL 中使用来自一个查询的 SUM

Python:如何将字符串转换为日期时间

python - 将零/南行添加到 pandas python 中的不连续索引

python - 将 Python 对象转换为适用于 PyV8 的 JavaScript

python pandas时间序列年提取

mysql - 使用 Join 删除孤立记录

mysql - SQL 子查询连接

python - 经理不在; 'auth.User' 已被替换为 'polls.User'

Python json 解析器允许重复键