熊猫-基于重复项创建新列

时间:2018-08-29 18:39:07

标签: python pandas

我想合并具有相同ID号的记录。例如,假设我有这个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')]查找重复的行,然后遍历每个重复的id并将详细信息添加到新列中,但想知道是否还有一些更优雅的方法。

有什么想起的吗?

3 个答案:

答案 0 :(得分:3)

尝试使用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

答案 1 :(得分:2)

您可以这样做:

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

哪个给你:

        0     1
id             
1     dog  None
2     cat  bear
4   mouse  None

答案 2 :(得分:2)

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