Итерация по фрейму данных с последующим добавлением данных из другого фрейма в зависимости от двух условий - PullRequest
0 голосов
/ 13 апреля 2019

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

Это кадр данных B:

    Clinton    Trump       State
0   151581.0   130614.0    Alabama
1   68429.0    91087.0     California
2   62435.0    89199.0     Arizona
3   22927.0    72846.0     Alaska
4   58669.0    33928.0     Arkansas

Это фрейм данных A:

    State       Education             Percentage
0   Alabama     NOHighSchoolPercent   0.85
1   Alabama     PostgraduatePercent   0.55
2   Alabama     BachelorsPercent      0.69
3   Arkansas    NOHighSchoolPercent   0.80
4   California  NOHighSchoolPercent   0.72

Я хочу добавить столбец «Majority» в A, который либо говорит «Трамп», либо «Клинтон» на основе количества голосов в фрейме данных BПервое условие состоит в том, что состояния должны совпадать, а второе условие проверяет, кто получил больше голосов.

Результирующий кадр данных A должен выглядеть примерно так:

        State       Education             Percentage   Majority
    0   Alabama     NOHighSchoolPercent   0.85         Clinton
    1   Alabama     PostgraduatePercent   0.55         Clinton
    2   Alabama     BachelorsPercent      0.69         Clinton
    3   Arkansas    NOHighSchoolPercent   0.80         Clinton
    4   California  NOHighSchoolPercent   0.72         Trump

Я знаю, какдобавить столбец и назначить условие, проблема в том, что условия находятся между 3 столбцами в отдельном кадре данных (B)

Я думал что-то вроде этого:

def get_result(votes_clinton, votes_trump):
    if votes_clinton > votes_trump
        return 'clinton'
    else
        return 'trump'

A['Majority'] = B['Clinton','Trump'].map(get_result)

Однако япо-прежнему необходимо учитывать, равны ли состояния, и это приводит к путанице в структуре кода

Примечание. Некоторые состояния могут отсутствовать в обоих кадрах данных

1 Ответ

2 голосов
/ 13 апреля 2019

Объединение находится в одном недублированном столбце в dfb, поэтому map подходит. Установите индекс, затем используйте .idxmax(axis=1).

dfa['Majority'] = dfa.State.map(dfb.set_index('State').idxmax(1))

print(dfa)
#        State            Education  Percentage Majority
#0     Alabama  NOHighSchoolPercent        0.85  Clinton
#1     Alabama  PostgraduatePercent        0.55  Clinton
#2     Alabama     BachelorsPercent        0.69  Clinton
#3    Arkansas  NOHighSchoolPercent        0.80  Clinton
#4  California  NOHighSchoolPercent        0.72    Trump

Результат dfb.set_index('State').idxmax(1) - это Серия, индексированная 'State', которая может использоваться для сопоставления 'State' в dfa с кандидатом в большинство.

State
Alabama       Clinton
California      Trump
Arizona         Trump
Alaska          Trump
Arkansas      Clinton
dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...