给出一个看起来像这样的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}}对。尤其是,由于0
是id=4
,而8
是id=5
,因此标识了这对-8
。同样,也标识了(4,5)
对。
我相信最简单的方法是使用(2,7)
循环,但是有矢量化函数可以做到吗?
答案 0 :(得分:1)
获得一系列df['values']
的反向符号,并将其与isin
一起使用。接下来,在abs
上呼叫groupby
和agg
和id
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)]