Ранжировать значения столбца в соответствии со значением предыдущего столбца во фрейме данных - PullRequest
0 голосов
/ 11 октября 2019

У меня есть такой фрейм данных

Value  Name
6   jameel
8   jameel
1   sarah
8   jameel
1   sarah
10  jameel
1   sarah
10  jameel
1   sarah
10  jameel
2   sarah
11  jameel
1   sarah
12  jameel
2   sarah
14  jameel
3   sarah
14  jameel

Я хочу скрыть этот фрейм данных, чтобы первое вхождение для sarah равнялось единице плюс предыдущее максимальное значение Jameel, поэтому в соответствии с этим фреймом данных первыйвхождение sarah находится в третьей строке, которая станет 9, поскольку максимальное предыдущее значение для jameel равно 8. После этого, где значение sarah равно 1, его следует заменить на 9, и оно не должно изменяться. Теперь, когда мы сделали это, мы можем заметить, что значение jameel увеличивается и становится максимальным в 10 в строке 8, так как оно не должно изменять последующее значение sarah как 1, а вместо этого должно изменять значение sarah в строке 11 на 10 + 1 =11, поскольку это не 1, а 2, и эта процедура должна следовать, и результирующий кадр должен выглядеть следующим образом.

Value  Name
6   jameel
8   jameel
9   sarah
8   jameel
9   sarah
10  jameel
9   sarah
10  jameel
9   sarah
10  jameel
11  sarah
11  jameel
9   sarah
12  jameel
11  sarah
14  jameel
15  sarah
14  jameel

Обратите внимание, что значения jameel и значения sarah по отдельности всегда находятся в порядке возрастания

значения для jameel: 6,8,10,11,12,14

значения для sarah: 1,2,3

Есть ли способ для этого в пандах или есть какой-либо другойпитонский путь к этому?

1 Ответ

1 голос
/ 11 октября 2019

Следующие действия должны помочь:

import pandas as pd

data = {'Value'     :[6,8,1,8,1,10,1,10,1,10,2,11,1,12,2,14,3,14],
        'Name'      :['J','J','S','J','S','J','S','J','S','J','S','J','S','J','S','J','S','J'],
        'Address'   :['rd','rd','rd','st','rd','st','rd','st','rd','rd','rd','rd','st','st','av','rd','av','av']}   

df = pd.DataFrame(data)

S_vals = df['Value'][df['Name'] == 'S']
J_vals = df['Value'][df['Name'] == 'J']

# Get locs of unique values
unique_vals = set(S_vals)
locs = [S_vals[df['Value'] == v].index[0] for v in unique_vals]

df_new = df.copy()

# Set values
for l in locs:
    for j in S_vals.index[S_vals==S_vals[l]]:
        df_new.at[j, 'Value'] = max(J_vals[J_vals.index<l])+1

        # This is deprecated
        #df_new.set_value(j, 'Value', max(J_vals[J_vals.index<l])+1)

Редактировать: добавлен дополнительный столбец, чтобы показать, что это работает для структур данных с большим количеством столбцов, чем просто «Значение» и «Имя».

Значения 'Sarah' и 'Jameel' хранятся в S_vals и J_vals. Расположение уникальных значений 'Sarah' затем сохраняется в locs. Затем устанавливаются значения:

  • Итерация по местоположениям уникальных значений
  • Для каждого уникального значения итерация по всем индексам, соответствующим совпадениям с Сарой, имеющей это значение (сначала мы делаем все 1, затем все 2 и т. д.)
  • Затем заменим каждое из значений, соответствующих Саре, на максимальное значение, соответствующее Джамилю, предшествующему этому, + 1

Это дает:

>>> print(df)
    Value Name Address
0       6    J      rd
1       8    J      rd
2       1    S      rd
3       8    J      st
4       1    S      rd
5      10    J      st
6       1    S      rd
7      10    J      st
8       1    S      rd
9      10    J      rd
10      2    S      rd
11     11    J      rd
12      1    S      st
13     12    J      st
14      2    S      av
15     14    J      rd
16      3    S      av
17     14    J      av

>>> print(df_new)
    Value Name Address
0       6    J      rd
1       8    J      rd
2       9    S      rd
3       8    J      st
4       9    S      rd
5      10    J      st
6       9    S      rd
7      10    J      st
8       9    S      rd
9      10    J      rd
10     11    S      rd
11     11    J      rd
12      9    S      st
13     12    J      st
14     11    S      av
15     14    J      rd
16     15    S      av
17     14    J      av

Я оставил закомментированную строку с .set_value: это устарело, но быстрее (см. этот анализ здесь ).

Наслаждайтесь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...