我需要在一个标识符上合并两个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'])]
这真的是最好的方法吗?似乎最好能在合并中进行筛选,以避免在合并之后、筛选完成之前出现可能非常大的数据帧。
目前还没有pandami这样做的方式
这个答案过去是关于处理多态性的问题,结果发现这是一个非常糟糕的主意。
然后^{} 函数出现在另一个答案中,但是没有什么解释,所以我想我会澄清如何使用这个函数。
分段的Numpy方式(内存很重)
^{} 函数可用于生成自定义联接的行为。这涉及到很多开销,而且效率不高,但它确实起到了作用。
连接的生产条件
这是一个数组列表,其中每个数组告诉我们,对于我们拥有的两个战争声明中的每一个,时间跨度这个词是否匹配。条件会随着更大的数据集而爆炸,因为它将是左df和右df的长度相乘。
分段“魔术”
现在分段将从术语中取出
president_id
,并将其放入每个对应的war的war_declarations
数据帧中。现在要完成这个例子,我们只需要定期合并总统的名字。
多态性(不起作用)
我想和大家分享我的研究成果,所以即使这不能解决问题,我也希望至少能把它作为一个有用的回答留在这里。由于很难发现错误,其他人可能会尝试这样做,并认为他们有一个可行的解决方案,而事实上,他们没有
我唯一能想到的另一个方法是创建两个新类,一个PointInTime和一个Timespan
两者都应该有
__eq__
方法,如果将PointInTime与包含它的Timespan进行比较,则返回true。之后,您可以用这些对象填充数据框,并连接它们所在的列。
像这样的:
重要提示:我没有对datetime进行子类划分,因为pandas会将datetime对象列的dtype视为datetime dtype,并且由于timespan不是,pandas会自动拒绝在它们上合并。
如果我们实例化这些类的两个对象,现在可以比较它们:
我们还可以用这些对象填充两个数据帧:
然后是融合的作品:
但只有一种。
PointInTime(2015,3,3)
也应该包含在Timespan(datetime(2015,2,1), datetime(2015,4,1))
上的此联接中但事实并非如此。
我想熊猫比较了
PointInTime(2015,3,3)
和PointInTime(2015,2,2)
,并假设由于它们不相等,PointInTime(2015,3,3)
不能等于Timespan(datetime(2015,2,1), datetime(2015,4,1))
,因为这个时间跨度等于PointInTime(2015,2,2)
有点像这样:
因此:
编辑:
我试图使所有的点彼此相等,这改变了连接的行为,将2015-3-3包括在内,但2015-2-2只包括在2015-2-1->;2015-2-5时间段内,所以这加强了我的上述假设。
如果有人有任何其他想法,请评论,我可以试试。
您现在应该可以使用包pandasql执行此操作了
我认为来自“ChuHo”的答案是好的。我相信pandasql也在为你做同样的事。我还没有把两者作为基准,但它更容易阅读。
正如您所说,这在SQL中很容易实现,那么为什么不在SQL中实现呢?
数据框:
相关问题 更多 >
编程相关推荐