Учитывая временной ряд DataFrame
, возможно ли создать новый DataFrame
с теми же размерами, но значения ранжируются для каждой строки по сравнению с другими столбцами (сначала упорядочено наименьшее значение)?
Пример:
ABC DEFG HIJK XYZ
date
2018-01-14 0.110541 0.007615 0.063217 0.002543
2018-01-21 0.007012 0.042854 0.061271 0.007988
2018-01-28 0.085946 0.177466 0.046432 0.069297
2018-02-04 0.018278 0.065254 0.038972 0.027278
2018-02-11 0.071785 0.033603 0.075826 0.073270
Первая строка станет:
ABC DEFG HIJK XYZ
date
2018-01-14 4 2 3 1
поскольку XYZ
имеет наименьшее значение в этой строке, а ABC
наибольшее.
numpy.argsort
выглядит так, как будто помогает мощь, однако, поскольку он выводит само местоположение, мне не удалось заставить его работать.
Большое спасибо
Используйте двойной argsort
для классифицировать для каждой строки и передайте в конструктор DataFrame
:
df1 = pd.DataFrame(df.values.argsort().argsort() + 1, index=df.index, columns=df.columns)
print (df1)
ABC DEFG HIJK XYZ
date
2018-01-14 4 2 3 1
2018-01-21 1 3 4 2
2018-01-28 3 4 1 2
2018-02-04 1 4 3 2
2018-02-11 2 1 4 3
Или используйте DataFrame.rank
с method='dense':
df1 = df.rank(axis=1, method='dense').astype(int)
print (df1)
ABC DEFG HIJK XYZ
date
2018-01-14 4 2 3 1
2018-01-21 1 3 4 2
2018-01-28 3 4 1 2
2018-02-04 1 4 3 2
2018-02-11 2 1 4 3
df.rank()
выглядит более естественным решением для этого требования. Проголосовал +1