如何从Pandas DataFrame中获取每行n个最大值并标记1/0
实现每行最大值/前N个最大值的0-1标记矩阵
先确认你的原始数据结构(运行你提供的代码后得到的close DataFrame):
import pandas as pd date = pd.date_range('10/01/2018', periods=5, freq='D') close = pd.DataFrame({ 'ABC': [1, 5, 3, 6, 2], 'EFG': [12, 51, 43, 56, 22], 'XYZ': [35, 36, 36, 36, 37], }, index=date)
1. 标记每行的最大值(单个最大值)
直接用df.eq(df.max(axis=1), axis=0)判断每个元素是否等于该行最大值,再转为整数类型(1/0):
# 生成最大值标记矩阵 max_mark = close.eq(close.max(axis=1), axis=0).astype(int) print(max_mark)
输出结果:
ABC EFG XYZ 2018-10-01 0 0 1 2018-10-02 0 1 0 2018-10-03 0 1 0 2018-10-04 0 1 0 2018-10-05 0 0 1
2. 标记每行前N个最大值(支持并列)
如果需要标记每行前k个最大值(包括并列情况),可以用rank方法对每行进行降序排名,再筛选排名≤k的位置:
示例:标记每行前2个最大值
k = 2 # 按行降序排名,method='min'保证并列值获得相同的最小排名 top_k_mark = close.rank(ascending=False, method='min', axis=1).le(k).astype(int) print(top_k_mark)
输出结果:
ABC EFG XYZ 2018-10-01 0 1 1 2018-10-02 0 1 1 2018-10-03 0 1 1 2018-10-04 0 1 1 2018-10-05 0 1 1
关键参数说明:
ascending=False:降序排名,数值越大排名越靠前method='min':对于并列的数值,使用它们的最小排名(比如某行有两个并列第二的数值,排名都为2,都会被计入前2)- 如果需要严格取前k个不同的数值(忽略并列),可以将
method改为'first',此时并列值会按列顺序分配不同排名
内容的提问来源于stack exchange,提问作者mahi mchrl
相关产品推荐
相关产品推荐

