如何基于现有Pandas DataFrame生成按日期去重姓名的新DataFrame
问题原因
你第一步drop_duplicates的逻辑是正确的,执行后会得到3行数据,分别对应每个Name在Sep-2015下的最后一条Count记录。
错误出在你手动构造df2的逻辑:字典推导式中每个Name对应的value是完整的Count列全部3个值,同时传入的索引也是3个重复的Sep-2015,最终生成了3行的错误结果,和预期1行的结构不符。
修正方案
不需要手动构造DataFrame,直接使用Pandas内置的长表转宽表方法pivot即可实现需求,代码更简洁也不会出错:
import pandas as pd df = pd.DataFrame((['Sep-2015', 'Adam',3 ], ['Sep-2015', 'David',3], ['Sep-2015', 'Adam',4], ['Sep-2015', 'Adam' ,3], ['Sep-2015', 'David',6], ['Sep-2015' , 'Hardik',1], ['Sep-2015' , 'David' ,3]),columns=['Date','Name','Count']) # 保留每个Date+Name组合的最后一条记录 df = df.drop_duplicates(['Date', 'Name'], keep='last') # 长表转宽表直接得到目标结构 df2 = df.pivot(index='Date', columns='Name', values='Count')
如果需要调整列顺序和你预期的完全一致,可以加一行重索引的代码:
df2 = df2[['Adam', 'Hardik', 'David']]
你也可以用groupby的写法省略单独去重的步骤,效果完全一致:
df2 = df.groupby(['Date', 'Name'], as_index=False)['Count'].last().pivot(index='Date', columns='Name', values='Count')
内容的提问来源于stack exchange,提问作者Sriram
相关产品推荐
相关产品推荐

