【发布时间】:2019-12-22 01:48:25
【问题描述】:
我有一个数据表df1,看起来像这样(df.groupby('id').agg(lambda x: x.tolist()) 的结果):
df1:
id people
51 [125, 126, 127, 128, 129]
52 [302, 303, 128]
53 [312]
在另一个数据框df2 中,我根据唯一的pid 映射了姓名和性别。 df1.people 中的列表条目实际上是那些 pid 项:
df2:
pid name gender
100 Jack Lumber m
125 Holly Polly f
126 Jeremy Owens m
127 Ron Bronco m
128 Natalia Berg f
129 Robyn Hill f
300 Crusty Clown m
302 Danny McKenny m
303 Tara Hill f
312 Glenn Dalough m
400 Fryda Beans f
现在我想用来自df2 的gender 字段替换或映射相应的pid,并在此创建以下所需的输出,包括列表计数:
Outcome:
id gender count_m count_f
51 [f, m, m, f, f] 2 3
52 [m, f, f] 1 2
52 [m] 1 0
创建此表的最佳方法是什么?
解决方案:
from collections import Counter
d = dict(df2.drop('name', 1).values)
m = df1.assign(gender=df1.name.apply(lambda x: [d.get(i) for i in x])).drop('people', 1)
n = pd.DataFrame([Counter(x) for x in m.gender], index=m.index).fillna(0).add_prefix('count_')
final = m.join(n)
【问题讨论】:
-
熊猫'0.24.2'
标签: pandas dictionary replace lookup