如何用Pandas风格方法将Series中的值替换为连续序号?
替换Pandas Series数值为连续序号的简洁写法
我是Python和Pandas新手,通过以下代码创建了一个带指定索引的Series:
import pandas as pd rank = pd.Series(data=[161.140890, 146.989804, 133.589100, 131.220764, 124.506911], index=['SB', 'EKDKQ', 'APD', 'DIS', 'MDR']) print(rank)
输出为:
SB 161.140890 EKDKQ 146.989804 APD 133.589100 DIS 131.220764 MDR 124.506911 dtype: float64
我希望将数值替换为1、2、3……的连续序号,目前用循环实现:
x = 1 for i, v in rank.items(): rank.loc[i] = x x += 1 print(rank)
得到输出:
SB 1.0 EKDKQ 2.0 APD 3.0 DIS 4.0 MDR 5.0 dtype: float64
但这种写法偏过程式,想找更贴合Pandas风格的实现方式。
方法1:直接生成新的Series(推荐)
利用原Series的索引,直接构造包含连续序号的新Series,完全避免循环:
rank = pd.Series(range(1, len(rank)+1), index=rank.index) print(rank)
输出:
SB 1 EKDKQ 2 APD 3 DIS 4 MDR 5 dtype: int64
如果需要保持浮点类型,可以把序号转成float:
rank = pd.Series([float(i) for i in range(1, len(rank)+1)], index=rank.index)
方法2:原地替换原Series的值
如果不想重新创建Series,直接原地修改值,利用切片赋值实现向量化操作:
rank[:] = range(1, len(rank)+1) print(rank)
输出和你用循环得到的结果一致(保持float类型):
SB 1.0 EKDKQ 2.0 APD 3.0 DIS 4.0 MDR 5.0 dtype: float64
方法3:基于数值排序生成序号(按需使用)
如果你的需求是按原数值从大到小生成序号(刚好和当前索引顺序一致),可以用rank方法:
rank = rank.rank(ascending=False, method='first').astype(int) print(rank)
输出:
SB 1 EKDKQ 2 APD 3 DIS 4 MDR 5 dtype: int64
这个方法适合原Series数值乱序的场景,能自动按数值大小分配对应序号。
内容的提问来源于stack exchange,提问作者EddyBoy
相关产品推荐
相关产品推荐

