Python从子集(对号码正在变化)时查找对

时间:2018-04-23 03:45:48

标签: python python-2.7 pandas data-manipulation

我有以下数据集:

d1 = {'Indiv1':['Subject1','Subject2','Subject1','Subject1','Subject2','Subject1','Subject1','Subject2'],
'Indiv2': ['Subject4','Subject3','Subject2','Subject4','Subject4','Subject2','Subject3','Subject3'],
'Event':['1','1','2','2','2','3','3','3'],
'Category':['1','2','1','1','1','2','2','2'],
'Variable1':['1','2','3','4','5','6','7','8'],
'Variable2':['12','11','10','9','8','7','6','5'],
'Variable3': ['-4','-3','-2','-1','0','1','2','3']}
d1 = pd.DataFrame(d1)  
d1=d1[['Indiv1','Indiv2','Event','Category','Variable1','Variable2','Variable3']]
d1

其中给出了以下内容(在我的数据集中,此特定文件超过200万行):

D1 =

enter image description here

我有第二个较小的数据集(约1500行),格式如下:

d2 = {'Indiv1': ['Subject1','Subject3','Subject1','Subject4','Subject2','Subject1','Subject1','Subject2'],
'Indiv2': ['Subject4','Subject2','Subject6','Subject1','Subject1','Subject8','Subject9','Subject113'],
'Event':['1','1','2','2','2','3','3','3'],
'Category':['1','2','1','1','1','2','2','2']}
d2 = pd.DataFrame(d2)
d2=d2[['Indiv1','Indiv2','Event','Category']]
d2

如下所示:

D2 =

enter image description here

我需要做的是从第二个文件(d2)中查找每个类别中每个事件中的主题对。如果对于给定的事件id和类别,该对在d1和d2中都是exixts,则为df1中的行分配1。否则分配0。

enter image description here

请注意,在df2的第2行中,将翻转两个人的顺序。在d2中,不是主题2和主题3,而是在d2中,我们有主题3和主题2.但是,在我的情况下,我想将两者视为相同。在这种情况下,我想为这些情况分配值1。

enter image description here

最后,d1中的对不在d2中(对于每个事件,对于每个类别)。例如,对于事件3,在df2中没有与Subject1和Subject 2的对(尽管这存在于df1中)。在这种情况下,在当前列下指定值= 0。最终输出将如下所示:

enter image description here

我对如何做到这一点特别感到困惑。特别是在这种情况下,分组可能会改变(Subject1和Subject 2)vs(Subject2和Subject 1)。

任何帮助将不胜感激。 Ty提前。

如果我不清楚,请告诉我

1 个答案:

答案 0 :(得分:1)

使用indiv1和indiv2与np.sort创建密钥,然后使用isin(使用d1.drop('key',1 inplace=True)删除它)

d2['key']=np.sort(d2.iloc[:,:2],axis=1).sum(1)+d2.Event.astype(str)
d1['key']=np.sort(d1.iloc[:,:2],axis=1).sum(1)+d1.Event.astype(str)
d1['persent']=d1.key.isin(d2.key).astype(int)
d1
Out[39]: 
     Indiv1    Indiv2 Event Category Variable1 Variable2 Variable3  \
0  Subject1  Subject4     1        1         1        12        -4   
1  Subject2  Subject3     1        2         2        11        -3   
2  Subject1  Subject2     2        1         3        10        -2   
3  Subject1  Subject4     2        1         4         9        -1   
4  Subject2  Subject4     2        1         5         8         0   
5  Subject1  Subject2     3        2         6         7         1   
6  Subject1  Subject3     3        2         7         6         2   
7  Subject2  Subject3     3        2         8         5         3   
                 key  persent  
0  Subject1Subject41        1  
1  Subject2Subject31        1  
2  Subject1Subject22        1  
3  Subject1Subject42        1  
4  Subject2Subject42        0  
5  Subject1Subject23        0  
6  Subject1Subject33        0  
7  Subject2Subject33        0