我刚被要求帮助解决这个问题,我不确定我能不能想出一段运行速度相当快的代码。
有两列数据:第一列是发起与某人联系的社交媒体用户的用户ID号;第二列是发起与某人联系的人的用户ID。此外,假设行按时间排序。
我希望以后能看到“跟踪”其追随者的所有用户ID。这就是我目前所拥有的,而且速度很慢。没有for循环我怎么做?

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))

最佳答案

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

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…”
使用df进行“自内连接”,将左表的merge与右表的followee匹配。现在,当您按左表的follower与右表的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

09-06 02:10