Слияние слева между групповым фреймом данных и исходным фреймом данных приводит к внешнему слиянию - PullRequest
0 голосов
/ 02 декабря 2018

Простой вопрос сегодня, вероятно, что-то, связанное с взаимодействием между DataFrame и сгруппированным фреймом данных, который пришел из него.

Дело в том, что у меня есть DataFrame, который имеет name, genderи foo переменных, например:

name    gender   foo
John      M       a
James     M       b
Jenny     F       c
John      M       d

Я хочу получить DataFrame с количеством появлений каждого имени и его полом.Я пробовал это:

df2=df.groupby('name', as_index=False).count()[['name','foo']]
aux=df[['name','gender']]
df2=df2.merge(aux, on='name', how='left')

Но это приносит DataFrame, который имеет то же количество строк, что и исходный DataFrame (четыре в этом примере вместо трех).Это должно быть довольно просто, так чего мне не хватать?

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Так что давайте использовать agg

df.groupby('name',as_index=False).agg({'gender':'first','foo':'count'})
    name gender  foo
0  James      M    1
1  Jenny      F    1
2   John      M    2
0 голосов
/ 02 декабря 2018

Бросьте дубликаты в aux:

aux = df[['name', 'gender']].drop_duplicates()

import pandas as pd

df = pd.DataFrame({'foo': ['a', 'b', 'c', 'd'],
                   'gender': ['M', 'M', 'F', 'M'],
                   'name': ['John', 'James', 'Jenny', 'John']})
df2 = df.groupby('name', as_index=False)['foo'].count()
aux = df[['name', 'gender']].drop_duplicates()
df2 = df2.merge(aux, on='name', how='left')
print(df2)

урожайность

    name  foo gender
0  James    1      M
1  Jenny    1      F
2   John    2      M

Кстати, вы можете использовать

df2 = df.groupby('name', as_index=False)['foo'].count()

вместо

df2 = df.groupby('name', as_index=False).count()[['name','foo']]

Это немного более эффективно, поскольку позволяет избежать подсчета столбца gender.


pd.merge(left, right, how='left') создает по одной строке для каждой строкив left, что соответствует строке в right.

В pd.merge(df2, aux, on='name', how='left'), поскольку John в df2 соответствует двум строкам в aux, генерируются две строки.

Соединение влево гарантирует, что каждая строка в left представлена ​​хотя бы один раз;со значениями NaN, заполненными, если совпадений нет.Соединение влево может вернуть больше строк, чем длина left точно, когда более чем одна строка в right соответствует строке в left.

Вот пример такого поведения в документах здесь .Если вы ищете how='left', вы найдете пример, где left имеет 4 строки, а right имеет 4 строки, но объединение имеет 5 строк.Обратите внимание, как пара (key1, key2) (K1, K0) представляется дважды.

Внутреннее объединение возвращает только все возможные строки, которые являются результатом совпадения.По сути, это то же самое, что и левое соединение, за исключением того, что строки с пустыми совпадениями и значениями NaN отбрасываются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...