Ранжирование с использованием столбцов разных типов в кадре данных Pandas с альтернативами для каждого столбца по возрастанию и по убыванию - PullRequest
1 голос
/ 27 сентября 2019

Я пытаюсь найти способ определить ранг, используя несколько столбцов в кадре данных панд.Эти столбцы могут вноситься в разных порядках, то есть в порядке возрастания или убывания, и могут иметь разные типы, например, int или str.

Я пытался поместить данные столбца в кортеж, а затем ранжировать их, используя метод ранга.Тем не менее, это обеспечивает только ранг в порядке возрастания или убывания для обоих столбцов.

import pandas as pd
df = pd.DataFrame(data={'String':['a','a','a','a','b'],'Integer':[1,2,3,3,1]})
df['tup'] = df.apply(tuple,axis=1)
# For both columns taken into account in ascending order
df['rank'] = df['tup'].rank() 
# For both columns taken into account in descending order
df['rank'] = df['tup'].rank(ascending=False) 

Я ожидаю, что выходные данные будут такими, как показано ниже, с String, принятой в качестве возрастания, и Integer, как по убыванию

# Expected 
  String  Integer     tup  rank
0      a        1  (a, 1)   4.0
1      a        2  (a, 2)   3.0
2      a        3  (a, 3)   1.5
3      a        3  (a, 3)   1.5
4      b        1  (b, 1)   5.0

но вместо этого для обоих столбцов учитывается как возрастающий

# Actual
  String  Integer     tup  rank
0      a        1  (a, 1)   1.0
1      a        2  (a, 2)   2.0
2      a        3  (a, 3)   3.5
3      a        3  (a, 3)   3.5
4      b        1  (b, 1)   5.0

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Вот подход.Вы можете настроить ascending так, как вы хотите, чтобы заказать столбцы (или столько столбцов, сколько хотите), однако, вы предпочитаете:

import pandas as pd
import numpy as np
df = pd.DataFrame(data={'String':['a','a','a','a','b'],'Integer':[1,2,3,3,1]})
df = df.sort_values(['String','Integer'], ascending=[True, False])
df['rank'] = np.arange(len(df)) + 1
df['rank'] = df.groupby(['String', 'Integer'])['rank'].transform('mean')
print(df)

Вывод:

  String  Integer  rank
2      a        3   1.5
3      a        3   1.5
1      a        2   3.0
0      a        1   4.0
4      b        1   5.0

Я спросилПодобный вопрос Основанный на этом, чтобы обобщить идею ранжирования нескольких типов столбцов, вы можете проверить его, чтобы отдать должное людям, которые также разработали ответ.

0 голосов
/ 27 сентября 2019

Я сделал это, рассчитав ранги обоих столбцов по отдельности, а затем поместив их в кортеж.Затем я могу использовать метод ранга для этого кортежа.

import pandas as pd
df = pd.DataFrame(data={'String':['a','a','a','a','b'],'Integer':[1,2,3,3,1]})
df['tup'] = tuple(zip(df['String'].rank(ascending=True), df['Integer'].rank(ascending=False)))
df['rank'] = df['tup'].rank()

Вывод приведен ниже -

  String  Integer         tup  rank
0      a        1  (2.5, 4.5)   4.0
1      a        2  (2.5, 3.0)   3.0
2      a        3  (2.5, 1.5)   1.5
3      a        3  (2.5, 1.5)   1.5
4      b        1  (5.0, 4.5)   5.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...