Панды группового с None - PullRequest
       4

Панды группового с None

0 голосов
/ 24 сентября 2018

Для кадра данных df

df = pd.DataFrame({'id': ['1', '1', None, None, '1', '2', '2', '3', None, '4'], 
               'last_name': ['Clinton', 'Clinton', 'Clinton','Clinton', None, 'Bush', 'Bush', None, 'Obama', 'Obama'],
               'first_name': ['Bill', 'William', 'Bill', 'William', None, 'Georg W.', 'Georg', None, 'Barack', 'Barack']})

df['id'] = df['id'].astype('category')
print(df)

, который дает следующую таблицу

    id last_name first_name
0    1   Clinton       Bill
1    1   Clinton    William
2  NaN   Clinton       Bill
3  NaN   Clinton    William
4    1       NaN       None
5    2      Bush   Georg W.
6    2      Bush      Georg
7    3       NaN       None
8  NaN     Obama     Barack
9    4     Obama     Barack

Я хочу сгруппировать по id и last_name, удалить дубликаты иудалить None, если есть более одной записи.Таким образом, вывод должен выглядеть как

              first_name
id  last_name           
1   Clinton       Bill
    Clinton       William
2   Bush          Georg W.
    Bush          Georg
3   None          None
4   Obama         Barack

Одна из моих проблем заключается в том, что groupby не работает, поскольку исключает значения None / NaN.

Какие-нибудь изящные идеи?

1 Ответ

0 голосов
/ 24 сентября 2018

IIUC, предполагая, что ваш фрейм данных имеет структуру, аналогичную той, которую вы разместили, вы можете использовать ffill() и группировать по ним, а затем dropna, только если len каждой группы больше 1.

df.groupby([df.id.ffill(), df.last_name.ffill()]).apply(lambda s: s.dropna() if len(s) > 1 else s).reset_index(drop=True)

    id  last_name   first_name  id2
0   1   Clinton     Bill        1
1   1   Clinton     William     1
2   2   Bush        Georg W.    2
3   2   Bush        Georg       2
4   3   None        None        3
5   NaN Obama       Barack      3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...