Как заменить определенные строки (в зависимости от условий), используя значения с аналогичными условиями условия в пандах? - PullRequest
0 голосов
/ 05 октября 2018

У меня проблема, когда я хочу заменить определенные значения, которые удовлетворяют условию, и заменить значения, основанные на другом условии.

Пример кадра данных (df)

     Gender    Surname    Ticket
` 0   masc     Family1     a12`
` 1 **fem      NoGroup     aa3**`
` 2   boy      Family1     125`
` 3 **fem      Family2     aa3**`
` 4   fem      Family4     525`
` 5   masc     NoGroup     a52`

Условие для замены значений de во всех строках столбца df ['Surname']:

if ((df['Gender']!= masc) & (df['Surname'] == 'NoGroup'))

Код должен искать строку, имеющую одинаковый тикет, и заменять соответствующее значение Фамилии, в противном случае сохранить уже существующее значение ('noGroup').

В этом примере [Фамилия'] значение в строке 1 (' noGroup ') следует заменить на' family2 ', что соответствует строке 3.

Я пробовал таким образом, но это не сработало

for i in zip((df['Gender']!='man') & df['Surname']=='noGroup'): df['Surname'][i] = df.loc[df['Ticket']==df['Surname'][i]]

1 Ответ

0 голосов
/ 05 октября 2018

С Pandas вы должны стремиться к векторизованным вычислениям, а не к построчным циклам.Вот один из подходов.Сначала преобразуйте выбранные значения в None:

df.loc[df['Gender'].ne('masc') & df['Surname'].eq('NoGroup'), 'Surname'] = None

Затем создайте отображение серии из Ticket в Surname после фильтра:

s = df[df['Surname'].notnull()].drop_duplicates('Ticket').set_index('Ticket')['Surname']

Наконец, сопоставьте нулевые значения сРасчетный ряд:

df['Surname'] = df['Surname'].fillna(df['Ticket'].map(s))

Результат:

  Gender  Surname Ticket
0   masc  Family1    a12
1    fem  Family2    aa3
2    boy  Family1    125
3    fem  Family2    aa3
4    fem  Family4    525
5   masc  NoGroup    a52
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...