使用pandas vectors函数查找成对的匹配值

时间:2019-08-22 05:56:50

标签: python pandas

给出一个看起来像这样的df

df1 = pd.DataFrame({'id' : [1, 2, 3, 4, 5, 6, 7],
                    'values' : [2, 4, 6, 8, -8, 10, -4]})

看起来像

   id  values
0   1       2
1   2       4
2   3       6
3   4       8
4   5      -8
5   6      10
6   7      -4

我想找到id之和为values的{​​{1}}对。尤其是,由于0id=4,而8id=5,因此标识了这对-8。同样,也标识了(4,5)对。

我相信最简单的方法是使用(2,7)循环,但是有矢量化函数可以做到吗?

2 个答案:

答案 0 :(得分:1)

获得一系列df['values']的反向符号,并将其与isin一起使用。接下来,在abs上呼叫groupbyaggid

s = df['values'] * -1
df[df['values'].isin(s)].abs().groupby('values').id.agg(tuple)

Out[81]:
values
4    (2, 7)
8    (4, 5)
Name: id, dtype: object

答案 1 :(得分:0)

如果values列中的值是唯一的:

#filter values pairs with absolute
a = df1.loc[df1['values'].le(0), 'values'].abs()
df = df1[df1['values'].abs().isin(a)].copy()
print (df)
   id  values
1   2       4
3   4       8
4   5      -8
6   7      -4

#convert column to absolute and filter out possible unique rows and aggregate tuples
df['values'] = df['values'].abs()
out = df[df['values'].duplicated(keep=False)].groupby('values')['id'].apply(tuple).tolist()
print (out)
[(2, 7), (4, 5)]

或者:

#filter nagative
df3 = df1[df1['values'].lt(0)].copy()
df3['values'] = df3['values'].abs()
print (df3)
   id  values
4   5       8
6   7       4

#filter pairs form absolute
df4 = df1[df1['values'].isin(df3['values'])]
#merge together anc convert id columns to tuples
out =  df4.merge(df3, on='values').filter(like='id').apply(tuple, 1).tolist()
print (out)
[(2, 7), (4, 5)]