Бросьте дубликаты в 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 отбрасываются.