Pandas DataFrame冗余索引处理:排序替代方案与Output 2实现问询
Pandas DataFrame 索引排序与聚合问题
我手里有一个以药品名称作为索引的 Pandas DataFrame q,未排序时相同的索引值(比如plavix)分散在不同位置。我通过调用.sort_index()得到了目标的 Output 1,但现在有两个问题想请教:
- (1) 是否存在更优方法实现 Output 1?
- (2) 如何实现需求中的 Output 2?
代码示例
import pandas as pd import numpy as np q = pd.DataFrame( np.array([1,2,3,4]), index=pd.Series(['plavix', 'warfarin', 'plavix', 'plavix'], index=[0,1,2,3]) ) # 当前实现 Output 1 的方式 output1 = q.sort_index()
问题解答
(1) 实现 Output 1 的更优方法
其实你用的.sort_index()已经是 Pandas 里处理索引排序最直接、最高效的方案啦!Pandas 内部对这个方法做了针对性优化,不管是单级索引还是多级索引,它都能快速完成排序,将相同索引的行集中到一起。
如果非要找替代思路的话,你可以在创建 DataFrame 后立即赋值排序结果,或者从外部数据源读取时直接指定排序(比如读取 CSV 时用pd.read_csv('data.csv', index_col=0, sort_index=True)),但这些操作本质上和你当前的.sort_index()调用没有性能差异,所以**.sort_index()本身就是最优解**。
(2) 实现 Output 2 的方法
虽然你没给出 Output 2 的具体样式,但结合场景推测,你应该是想对相同索引的行做聚合处理(比如求和、取均值、合并信息等),让每个唯一索引只保留一行结果。这时候用groupby配合聚合函数就能轻松实现:
举几个常见场景的示例:
- 对相同索引的数值求和:
output2 = q.groupby(level=0).sum()
- 取每个索引组的第一行/最后一行数据:
# 取第一行 output2 = q.groupby(level=0).first() # 取最后一行 output2 = q.groupby(level=0).last()
- 自定义聚合逻辑(比如同时计算求和与均值):
output2 = q.groupby(level=0).agg({0: ['sum', 'mean']}) # 0 是你的列名,可根据实际修改
如果你的索引是多级索引(药品+剂型),只需把level=0改成对应的层级(比如level=[0,1])或者直接使用索引名称即可,非常灵活!
内容的提问来源于stack exchange,提问作者vintagedeek
相关产品推荐
相关产品推荐

