Python从子集中查找对(对编号正在更改)
我有以下数据集:Python从子集中查找对(对编号正在更改),python,python-2.7,pandas,data-manipulation,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','
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=
我还有第二个较小的数据集(大约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=
我需要做的是从第二个文件(d2)中查找每个类别中每个事件的主题对。如果给定事件id和类别的对在d1和d2中都存在,则将1分配给df1中的行。否则,指定0
注意,在df2的第2行中,两个个体的顺序是颠倒的。与d1中的主题2和主题3不同,d2中有主题3和主题2。然而,在我的情况下,我想将两者视为相同的。在本例中,我想为这些情况指定一个值1
最后,d1中有对不在d2中(对于每个事件,对于每个类别)。例如,对于事件3,df2中没有与Subject1和Subject2的配对(尽管df1中存在)。在这种情况下,在当前列下指定一个值=0。最终输出如下所示:
我对怎么做特别困惑。尤其是在这种情况下,分组可能会改变(主题1和主题2)与(主题2和主题1)
任何帮助都将不胜感激。提前打电话
如果我不清楚请告诉我,使用indiv1和indiv2与
np.sort
一起创建密钥,然后使用isin
(使用d1.drop('key',1 inplace=True)将其删除
)
谢谢你的回答@Wen。当present的值应该为零时,我看到了两个1(第5行和第7行)。请注意,对于类别2中的事件3,我们不观察主题1和主题2。如何按事件和类别限制查找?在当前状态下,我认为查找是在整个数据集上进行的。我想看看类别1中的事件1是否存在受试者1和受试者4这对。如果我的问题有点困惑,请告诉我。我可以编辑我原来的问题。谢谢,普罗米修斯找到你了,一个sec@Prometheus检查更新,另外,我在这里创建新密钥是为了加快过程,通常我们可以使用
groupby
,但是由于您的d1很大,我认为创建新密钥更有效
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