如何在Pandas中按含重复值的列表重复选取对应行?
解决方案:按带重复值的列表顺序选取Pandas DataFrame行
嘿,这个问题我碰到过好几次了——isin()确实会自动去重,完全没法保留你要的重复项和原列表顺序。不用写循环,这里有两个简洁高效的解决方案:
先重现你的示例数据
首先我们先把你给出的示例DataFrame和目标列表用代码还原,方便验证:
import pandas as pd # 构建原始DataFrame df = pd.DataFrame({ 'id': [1, 2, 3, 4], 'value': [0.5, 0.3, 0.4, 0.8], 'date': ['01-01-20', '01-02-20', '01-03-20', '01-04-20'] }) # 带重复值的目标日期列表 target_dates = ('01-01-20', '01-01-20', '01-02-20')
方法1:使用merge保留顺序与重复项
把目标列表转换成带索引的临时Series,通过合并操作就能完美保留原列表的顺序和重复项:
# 将目标列表转为带原顺序索引的Series temp_series = pd.Series(target_dates, name='date').reset_index() # 合并后按临时索引排序,恢复原列表顺序,再清理临时列 result = (temp_series .merge(df, on='date') .sort_values('index') .drop('index', axis=1) .reset_index(drop=True))
方法2:set_index + reindex(更简洁)
如果你的date列在原始DataFrame中是唯一值(就像你的示例),这种方法更直接:
# 将date设为索引,按目标列表重索引,最后恢复原索引结构 result = df.set_index('date').reindex(target_dates).reset_index()
验证结果
两种方法都会得到你想要的输出:
id value date 0 1 0.5 01-01-20 1 1 0.5 01-01-20 2 2 0.3 01-02-20
为什么isin()不行?
df[df['date'].isin(target_dates)]会自动对匹配结果去重,只返回每个符合条件的行一次,而且返回的行顺序是原DataFrame的顺序,和你提供的目标列表顺序无关,所以满足不了需求。
内容的提问来源于stack exchange,提问作者biofa.esp
相关产品推荐
相关产品推荐

