Попытка вычислить процентный ранг для каждой строки на основе типа (который представляет собой столбец с около 10 строк) - PullRequest
0 голосов
/ 29 мая 2018

У меня есть фрейм данных из более чем миллиона строк с такой примерной структурой:

Тип ID Значение1 Значение2 ... (больше столбцов)

1 A 20 4 ...

2 A 30 5 ...

3 B 14 7 ...

4 B 12 9 ...

.....

НадеюсьЯ мог бы получить

Идентификатор Тип Значение1 Значение2 Pct_Rank_based_on_Value1 ... (больше столбцов)

1 A 20 4 0.107 ...

2 A 30 5 0,021 ...

3 B 14 7 0.201 ...

4B 12 9 0,875 ...

.....

ранг должен быть в порядке убывания значения.Максимальное значение должно иметь значение около 0,001

. И для пояснения, моя цель - создать новый столбец, который представляет собой процентное ранжирование значения Value1 строки (которое является столбцом дискретных чисел) в пределах его типа (который является столбцом строк, только 10 уникальных значений).

Для строки 1 идентификатор равен 1, тип равен A, значение равно 20, я хотел бы вычислить его pct-ранг значения Value1 в тех строках, тип которых также равен A.

  1. Я проверил несколько реализаций поста и думаю об использовании

    df ['Pct_Rank'] = pd.DataFrame (df.groupby ("Type"). Index.get_level_values ​​('Value1') .rank (pct = True)

    Но я не уверен, правильно ли это.

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

increment_type_A = 1 / lengthA

....

, если type == A:

pct_rank = increment_typeA * position_in_its_type

.......

Кстати, есть ли параметры для установки pct? Например, точность? Я хочу что-то вроде 0.001 как минимум.

Updates

Я просто переформатировал мой образец.Стол был испорчен после того, как я выбрал их и выбрал «жирный».

Только что отредактировано, чтобы уточнить, что в нем более 1 числового столбца.И Value1 - это не первый столбец с числовым значением.

1 Ответ

0 голосов
/ 29 мая 2018

Если я правильно понял вопрос, это должно сработать:

from pandas import DataFrame
df = DataFrame([['A', 20, 1], ['A', 30, 2], ['B', 14, 1], ['B', 12, 6]], columns=['Type', 'Value1', 'Value2'])
df['pct_rank'] = df.groupby('Type').rank(axis=0, pct=True, ascending=False)['Value1']
...