我有这个结构化的pandas数据帧DF1:
import pandas as pd
df = pd.DataFrame({'id': [1, 2], 'name': ['A', 'B'], 'ex': ['A1', 'B1'], 'init': ['1,3,5,7,', '10,12,15,17,20,'], 'end':['2,4,6,8,', '15,18,21,24,32']}, columns=['id', 'name', 'ex', 'init', 'end'])
print df
id name ex init end
1 A A1 1,3,5,7, 2,4,6,8,
2 B B1 10,12,15,17,20, 15,18,21,24,32
...
init 和 end 列表示间隔(init-end),因此:A - > (1,2),(3,4),(5,6),(7,8),B-> (10,15),(12,18),(15,21),(17,24),(20 ,32),... 另一方面,还有另一个数据帧DF2也表示间隔:
import pandas as pd
df2 = pd.DataFrame({'id': [1, 2], 'init': ['3', '16'], 'end':['6', '22']}, columns=['id', 'init', 'end'])
print df2
id init end
1 3 6
2 16 22
...
有没有智能有效的方法来检查DF1的范围包含DF2中的范围?在该示例中,输出将是新的DF3:
id name ex ranges
1 A A1 (3,4), (5,6)
2 B B1 (12,18),(15,21),(17,24)
我对此有点受阻,我们将不胜感激。在此先感谢!!
答案 0 :(得分:0)
这就是我要做的事情
df['init'],df['end']=df.init.str.split(','),df.end.str.split(',')
df
Out[1915]:
id name ex init end
0 1 A A1 [1, 3, 5, 7] [2, 4, 6, 8]
1 2 B B1 [10, 12, 15, 17, 20] [15, 18, 21, 24, 32]
s=df.init.str.len()
s
Out[1917]:
0 4
1 5
Name: init, dtype: int64
NewDF=pd.DataFrame({'id':df.id.repeat(s),'name':df.name.repeat(s),'ex':df.ex.repeat(s),'init':df.init.sum(),'end':df.end.sum()})
s2=NewDF.merge(df2.set_index('id').stack().reset_index(),on='id').loc[lambda x : (x['end']>=x[0])&(x[0]>=x['init'])]
s2['New']=tuple(zip(s2.init,s2.end))
s2.groupby(['ex','id']).New.apply(list)
Out[1943]:
ex id
A1 1 [(3, 4), (5, 6)]
B1 2 [(12, 18), (15, 21), (17, 24), (20, 32)]
Name: New, dtype: object