Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何查看列元素是否在以后的行中交换_Python_Python 3.x_Pandas_Numpy - Fatal编程技术网

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

Python 如何查看列元素是否在以后的行中交换,python,python-3.x,pandas,numpy,Python,Python 3.x,Pandas,Numpy,我刚刚被要求在这方面提供帮助,我不确定我能想出一段运行速度相当快的代码 有两列数据:第一列是社交媒体用户的用户id号,该用户发起与某人的联系;第二列是他们开始联系的人的用户id。此外,假设行是按时间排序的 我希望在以后的某个日期看到“跟踪”其追随者的所有用户ID。这就是我到目前为止所做的,而且速度很慢。在没有for循环的情况下如何执行此操作 def myFun2(num): N = df.shape[0] init_follower = df['follower'][num]

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

有两列数据:第一列是社交媒体用户的用户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

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
与右表的
followe
相匹配。现在,当您将左表的
跟随者
与右表的
跟随者
相同的所有行进行子集时,您实际上得到了您想要的:

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
编辑: 对于您提供的数据帧:

输出:

1    150
1    b
我希望看到“跟踪”他们的用户的所有用户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