我需要在一个标识符上合并两个 pandas 数据帧,以及一个数据帧中的日期介于另一个数据帧中的两个日期之间的条件。
数据框 A 有一个日期(“fdate”)和一个 ID(“cusip”):
我需要将它与这个数据框 B 合并:
关于 A.cusip==B.ncusip
和 A.fdate
在 B.namedt
和 B.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/