【问题标题】:Python find pairs when from subset (pair numbers are changing)Python 从子集中查找对(对数正在变化)
【发布时间】:2018-04-23 03:45:47
【问题描述】:

我有以下数据集:

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 和 Subject 2 的配对(尽管 df1 中存在这对)。在这种情况下,在当前列下分配一个值 =0。最终输出将如下所示:

我对如何做到这一点尤其感到困惑。尤其是在分组可能发生变化的情况下(主题 1 和主题 2)与(主题 2 和主题 1)。

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

如果我不清楚,请告诉我

【问题讨论】:

    标签: python python-2.7 pandas data-manipulation


    【解决方案1】:

    通过使用带有np.sort 的indiv1 和indiv2 创建一个密钥,然后使用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  
    

    【讨论】:

    • 感谢@Wen 的回答。当 present 的值应该为零时,我看到了几个(第 5 行和第 7 行)。请注意,对于类别 2 中的事件 3,我们没有观察到 Subject1 和 Subject2。如何按事件和类别限制查找?在当前状态下,我认为查找是针对整个数据集的。我想查看类别 1 中的事件 1 是否存在主题 1 和主题 4 对。如果我的问题有点令人困惑,请告诉我。我可以编辑我原来的问题。谢谢。
    • @Prometheus 抓住你,一秒
    • @Prometheus 检查更新,另外,我在这里创建新密钥是为了加快进程,通常我们可以使用groupby,但是由于您的 d1 很大,我认为创建一个新密钥效率更高
    猜你喜欢
    • 1970-01-01
    • 2013-08-23
    • 2023-02-10
    • 2016-04-20
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多