我有两个熊猫数据框:
# DataFrame A
ID Date equity
1078604 2000-03-31 145454
1078604 2000-06-30 138536
1078604 2000-09-30 143310
上面的框架包含超过200,000行的公司,这些公司的ID和资产值在季度末。
# DataFrame B
ID OtherId Start End
1078604 25 1986-06-30 2006-11-04
1049734 94 1986-06-30 1992-10-30
1064894 96 1986-06-30 1990-08-31
帧B包含相同的ID和另一个标识符(OtherId
),其中OtherId
对从Start
到End
的日期有效。
对于合并,我现在依靠此pandasql
语句来达到目的:
import pandasql as ps
def merge_ranges_simple(A, B, sqlcode):
return(ps.sqldf(sqlcode,locals()))
sqlcode = '''SELECT A.ID, A.equity, b.OtherId
from A, B
where A.ID = B.ID and A.Date >= B.Start and A.Date <= B.End'''
C = merge_ranges_simple(A, B, sqlcode)
结果框架产生一个框架,其中ID
和OtherId
在正确的日期匹配。 (我不太担心不包括股权价值。)
但是我想知道,如果没有SQL,python和pandas不能做同样的事情吗?
答案 0 :(得分:0)
如果我理解正确:
让我们假设第一个数据帧(通过稍微更改ID和日期中的值来创建工作示例):
>>df
ID Date equity
0 1139710 2000-03-31 145454
1 1139710 2000-06-30 138536
2 1022764 2000-09-30 143310
和第二个:
>>df1
ID OtherId Start End
0 1139710 21 2000-06-29 2000-06-30
1 1078604 25 1986-06-30 2006-11-04
2 1049734 94 1986-06-30 1992-10-30
3 1064894 96 1986-06-30 1990-08-31
df_new=df.merge(df1,on='ID')
>>df_new
ID Date equity OtherId Start End
0 1139710 2000-03-31 145454 21 2000-06-29 2000-06-30
1 1139710 2000-06-30 138536 21 2000-06-29 2000-06-30
使用pd.series.between()
跟踪您的情况:
df_new[df_new.Date.between(df_new.Start,df_new.End)]
ID Date equity OtherId Start End
1 1139710 2000-06-30 138536 21 2000-06-29 2000-06-30
希望这会有所帮助。