Как я могу запросить кадр данных pandas, чтобы получить записи, связанные с разными значениями в одном столбце? По сути, это совместный запрос:
data = {"id": ["a", "a", "a", "b", "b", "c", "c", "d", "e", "f", "f", "f"],
"x": [1, 2, 3, 1, 3, 5, 1, 7, 2, 4, 9, 11],
"y": [1985, 1986, 1987, 1985, 1987, 1990, 1985, 1994, 1985, 1989, 1993, 1993]}
df = pd.DataFrame(data)
print(df)
id x y
0 a 1 1985
1 a 2 1986
2 a 3 1987
3 b 1 1985
4 b 3 1987
5 c 5 1990
6 c 1 1985
7 d 7 1994
8 e 2 1985
9 f 4 1989
10 f 9 1993
11 f 11 1993
Учитывая приведенные выше данные, я хотел бы получить функцию f(id1, id2, year=None)
, которая бы искала x
, которые связаны как с id1, так и с id2. Таким образом, f('a', 'b')
будет возвращать фрейм данных, который соответствует {x: [1, 3], y: [1985, 1987]}
x y
0 1 1985
1 3 1987
, поскольку x = 1 и x = 3 связаны си 'a', и 'b'.
В идеале я хочу иметь возможность делать это таким образом, чтобы можно было выполнять фильтрацию и по значениям 'y'. Кроме того, датафрейм довольно большой, и это служебная функция, которая будет часто запускаться, поэтому важна эффективность. Я думал о том, чтобы дважды запрашивать разные идентификаторы и объединять:
In [15]: pd.merge(df.query('id=="a"'), df.query('id=="b"'), on='x')
Out[15]:
id_x x y_x id_y y_y
0 a 1 1985 b 1985
1 a 3 1987 b 1987
, но мне кажется, что это не самый элегантный и эффективный способ.