Следующие действия должны помочь:
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
: это устарело, но быстрее (см. этот анализ здесь ).
Наслаждайтесь!