Панды - создать новый столбец на основе дубликатов - PullRequest
0 голосов
/ 29 августа 2018

Я хотел бы объединить записи, которые имеют идентичный идентификационный номер. Например, предположим, у меня есть этот DataFrame:

df=pd.DataFrame({'id': [1, 2, 2, 4], 'animal': ['dog', 'cat', 'bear', 'mouse']})

# just rearranging the order a bit
df=df[['id', 'animal', 'name']]

  id animal name
  1   dog   john
  2   cat   mary
  2   bear  mary
  4   mouse joe

То, что я хотел бы закончить, это способ получить следующее:

id  name  animal  more_animals
 1  john   dog      NaN
 2  mary   cat      bear
 4  joe    mouse    NaN

Я мог бы использовать df[df.duplicated('id', 'last')], чтобы найти дублирующиеся строки, затем пройтись по каждому дублированному идентификатору и добавить детали в новый столбец, но задавался вопросом, было ли что-то более элегантное.

Что-нибудь приходит на ум?

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Попробуйте с помощью cumcount создать новый ключ, затем pivot

newdf=df.assign(Newid=df.groupby('id').cumcount())
newdf.pivot('id','Newid','animal')
Out[448]: 
Newid      0     1
id                
1        dog  None
2        cat  bear
4      mouse  None
0 голосов
/ 29 августа 2018
import pandas as pd
import numpy as np
from collections import defaultdict
from itertools import count

d = defaultdict(count)

i, r = pd.factorize([*zip(df.id, df.name)])
j = np.array([next(d[x]) for x in i])

n, m = len(r), j.max() + 1

b = np.empty((n, m), dtype=np.object)
b[i, j] = df.animal

d1 = pd.DataFrame(r.tolist(), columns=['id', 'name'])
d2 = pd.DataFrame(b, columns=['animal', 'more_animal'])
d1.join(d2)

   id  name animal more_animal
0   1  john    dog        None
1   2  mary    cat        bear
2   4   joe  mouse        None
0 голосов
/ 29 августа 2018

Вы можете сделать:

df.groupby('id')['animal'].apply(lambda x: pd.Series(list(x))).unstack()

Что дает вам:

        0     1
id             
1     dog  None
2     cat  bear
4   mouse  None
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...