【发布时间】:2016-12-02 03:17:53
【问题描述】:
我有两个 pandas 数据框,我想将它们与规则结合起来。
这是第一个数据帧
import pandas as pd
df1 = pd.Dataframe()
df1
rank begin end labels
first 30953 31131 label1
first 31293 31435 label2
first 31436 31733 label4
first 31734 31754 label1
first 32841 33037 label3
second 33048 33456 label4
....
第二个数据框只有两列,rank 和 start
df2
rank start
first 31333
first 31434
first 33039
first 33123
first 33125
在第一个数据帧df1 中,数据有begin 和end。我想检查df2中start的整数是否在这个范围内。
这是它的最终结果:
result
rank start labels
first 31333 label2
first 31434 label2
first 33039 NaN
first 33123 label4
first 33125 label4
start==31333 介于df1 和label = label2 中的31293 到31435 之间。整数31434 也在31293:31435 范围内,所以它也被label2 注释。 33039 的值不在df2 的任何区间之间,所以它得到一个NaN 的值。
这些数据帧的组合规则是这样的:
(df2.start >= df1.begin) & (df2.start <= df1.end)
而且,每一行必须匹配相同的排名值,例如对于此条件,每一行都必须首先匹配字符串。
这是我用来组合这两个数据帧的代码,但它的扩展性并不好:
from numpy import nan
def between_range(row):
subset = df1.loc[(row["rank"] == df1.rank) & (row.start >= repeats.start) & (row.start <= repeats.end), :]
if subset.empty:
return np.nan
return subset.labels
是否有另一种方法可以通过合并(可能是排名)来做到这一点?还有其他基于 pandas 的解决方案吗?
【问题讨论】:
-
@Kartik 我试图在这里简化问题。感谢您的帮助
-
@MaxU 我已经更新了上面的内容。有什么想法可以扩展/工作吗?
标签: python pandas dataframe merge dask