如何按列表重复次数从DataFrame中选行且不改变列顺序?
问题
现有如下Pandas DataFrame:
import pandas as pd data = {'Date': ['22-08-2021', '12-09-2021', '02-10-2021', '22-11-2021'], 'ID': ['A', 'B', 'C', 'O'], 'Item':['Apple','Banana','Carrot', 'Orange'], 'Cost':[10, 12, 15, 13]} dataframe = pd.DataFrame(data)
另有ID列表:
index_list = ['A', 'A', 'B', 'B', 'O', 'C', 'C']
需要按照index_list中ID的重复次数与顺序,选取DataFrame中对应行生成目标DataFrame。目前已通过for循环实现,希望找到Pandas内置的更优雅高效的实现方法。
高效实现方法
推荐两种Pandas原生的高效实现方式,均无需手动循环:
方法1:使用merge合并
将index_list转换为单列DataFrame,再与原DataFrame按ID字段合并,自动匹配并生成对应重复行:
# 把index_list转为DataFrame id_df = pd.DataFrame({'ID': index_list}) # 合并得到目标DataFrame result_df = id_df.merge(dataframe, on='ID')
方法2:使用reindex重索引
先将原DataFrame的索引设为ID,再通过reindex按照index_list的顺序和重复值重新生成行,最后重置索引:
# 设置ID为索引,重索引后重置索引 result_df = dataframe.set_index('ID').reindex(index_list).reset_index()
两种方法都能得到相同的目标结果,输出示例:
ID Date Item Cost 0 A 22-08-2021 Apple 10 1 A 22-08-2021 Apple 10 2 B 12-09-2021 Banana 12 3 B 12-09-2021 Banana 12 4 O 22-11-2021 Orange 13 5 C 02-10-2021 Carrot 15 6 C 02-10-2021 Carrot 15
这两种方法都利用了Pandas内部优化的向量操作,性能远优于手动for循环,尤其在数据量较大时优势明显。
内容的提问来源于stack exchange,提问作者Henry
相关产品推荐
相关产品推荐

