Как отфильтровать pandas groupby объект на основе groupby.groups.keys () - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть pandas dataframes df1 и df2

df1:
     City  Pop Homes Other
0  City_1  100     1     0
1  City_1  100     2     6
2  City_1  100     2     2
3  City_1  100     3     9
4  City_1  200     1     6
5  City_1  200     2     6
6  City_1  200     3     7
7  City_1  300     1     0

df2:
     City  Pop Homes Other
0  City_1  100     1     0
1  City_1  100     2     6
2  City_1  100     2     2
3  City_1  100     8     9
4  City_1  200     1     6
5  City_1  200     2     6
6  City_1  800     3     7
7  City_1  800     8     0

И я хочу создать df3, который имеет те же столбцы, что и df1 и df2, но включает только строки, в которых парные значения Pop и Homes совпадают.

df3:
     City  Pop Homes Other
0  City_1  100     1     0
1  City_1  100     2     6
2  City_1  100     2     2
4  City_1  200     1     6
5  City_1  200     2     6

Чтобы получить пары в df1 и df2, я сделал:

df1_string = """
City_1      100      1     0
City_1      100      2     6
City_1      100      2     2
City_1      100      3     9
City_1      200      1     6
City_1      200      2     6
City_1      200      3     7
City_1      300      1     0"""

df2_string = """
City_1      100      1     0
City_1      100      2     6
City_1      100      2     2
City_1      100      8     9
City_1      200      1     6
City_1      200      2     6
City_1      800      3     7
City_1      800      8     0"""

df1 = pd.DataFrame([x.split() for x in df1_string.split('\n')], columns=['City', 'Pop', 'Homes', 'Other'])
df2 = pd.DataFrame([x.split() for x in df2_string.split('\n')], columns=['City', 'Pop', 'Homes', 'Other'])

df1_keys = [x for x in df1.groupby(['Pop', 'Homes']).groups.keys()]
df2_keys = [x for x in df2.groupby(['Pop', 'Homes']).groups.keys()]

print(df1_keys)
[('100', '1'), ('100', '2'), ('100', '3'), ('200', '1'), ('200', '2'), ('200', '3'), ('300', '1')]
print(df2_keys)
[('100', '1'), ('100', '2'), ('100', '8'), ('200', '1'), ('200', '2'), ('800', '3'), ('800', '8')]

Но я не знаю, как отсюда фильтровать df1.Я думал, что это будет примерно так:

df1 = df1[df1.groupby(['Pop', 'Homes']).groups.keys().isin(df2.groupby(['Pop', 'Homes']).groups.keys())]   

Но это не сработает.

Следует также отметить, что df1 и df2 не всегда имеют одинаковую длину.

РЕШЕНИЕ

df1.set_index(['Pop', 'Homes'], inplace=True)
df2.set_index(['Pop', 'Homes'], inplace=True)

df1 = df1[df2.index.isin(df1.index)]

df1.reset_index(inplace=True)

1 Ответ

0 голосов
/ 11 апреля 2019

Установка индексов как Pop и Home генерирует значение 'pair', а использование isin () применяет необходимый фильтр:

df1.set_index(['Pop', 'Homes'], inplace=True)
df2.set_index(['Pop', 'Homes'], inplace=True)

df1 = df1[df2.index.isin(df1.index)]

df1.reset_index(inplace=True)
print(df1)
...