Pandas根据df1中的列来检索值,这些列表示来自df2

时间:2018-02-26 14:52:33

标签: python pandas dataframe

我有这个结构化的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)

我对此有点受阻,我们将不胜感激。在此先感谢!!

1 个答案:

答案 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