代码之家  ›  专栏  ›  技术社区  ›  Taylor

如何查看列元素是否在以后的行中交换

  •  4
  • Taylor  · 技术社区  · 6 年前

    我刚刚被要求在这方面提供帮助,我不确定我能想出一段运行速度相当快的代码。

    共有两列数据:第一列是社交媒体用户的用户id号,该用户发起与某人的联系;第二列是他们开始联系的人的用户id。此外,假设行是按时间排序的。

    def myFun2(num):
        N = df.shape[0]
        init_follower = df['follower'][num]
        init_followee = df['followee'][num]
        for i in range(num+1,N):
            a = init_followee == df['follower'][i]
            b = init_follower == df['followee'][i]
            if a and b:
                return i
    
    df = pd.DataFrame({'follower' : ['a', 'a', 'b'], 'followee' : ['b', 'c', 'a']})
    
    # prints 2 because that's the row where a follows back b
    for i in range(df.shape[0]):
        print(myFun2(i))
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   Vishnu Kunchur    6 年前

    这里有一个方法。给定一个数据帧 df :

    df = pd.DataFrame(columns = ['follower', 'followee'])
    df.loc[0] = [123, 111]
    df.loc[1] = [123, 150]
    df.loc[2] = [145, 123]
    df.loc[3] = [150, 123]
    
    df
    
      follower followee
    0      123      111
    1      123      150
    2      145      123
    3      150      123
    

    “我希望看到“跟踪”其追随者的所有用户ID…”

    使用 merge followee 在你右边的桌子上 follower . 现在,当您将左表的 与右表相同 跟随者

    a = df.merge(df, left_on = 'followee', right_on = 'follower')
    b = a[a['follower_x'] == a['followee_y']][['follower_x', 'followee_x']].\
        reset_index().rename(columns = {'index' : 'timestamp', 'follower_x' : 'follower', 'followee_x' : 'followee'})
    

    “…以后”

    假设你的行是按时间排序的,以得到后来成为跟随者的跟随者;

    b['grp'] = b[['follower', 'followee']].apply(lambda x: str(np.sort(x.tolist())), axis = 1)
    b['rank'] = b.groupby('grp')['timestamp'].apply(lambda x: x.rank(ascending = False))
    b[b['rank'] == 1]['follower']
    

    输出:

    1    150
    

    编辑:

    对于您提供的数据帧:

    输出:

    1    b
    
        2
  •  1
  •   jpp    6 年前

    我希望看到所有的人谁“跟踪”他们的用户ID

    df_flip = pd.DataFrame(np.flip(df.values, 1), columns=df.columns)
    res = df.merge(df_flip, how='inner')
    
    print(res)
    
      follower followee
    0        a        b
    1        b        a
    

    然后在订购后删除重复项:

    res = res[~pd.DataFrame(np.sort(res.values, 1)).duplicated()]
    
    print(res)
    
      follower followee
    0        a        b