我想合并具有相同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并将详细信息添加到新列中,但想知道是否还有一些更优雅的方法。
有什么想起的吗?
答案 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