Перебор столбцов и сравнение каждого значения строки этого столбца со значением другого столбца в Pandas - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь перебрать диапазон из 3 столбцов (с именами 0, 1, 2). в каждой итерации этого столбца я хочу сравнить каждое построчное значение с другим столбцом под названием Флаг (построчное сравнение на равенство) в том же кадре. Затем я хочу вернуть соответствующее поле.

Я хочу проверить, совпадают ли значения.

Может быть, есть более простой способ объединить эти столбцы в один список, затем выполнить итерацию по этому списку и посмотреть, есть ли какие-либо соответствия этому дополнительному столбцу? Я еще не очень хорошо разбираюсь в Пандах или Нампи.

Я пытаюсь придумать что-то эффективное, так как у меня есть большой набор данных для этого.

Большая часть этой мысли довольно свободна, поэтому я просто пробую много разных методов

Некоторые попытки использования итерации по каждому методу столбца:


##Sample Data
df = pd.DataFrame([['123','456','789','123'],['357','125','234','863'],['168','298','573','298'], ['123','234','573','902']])
df = df.rename(columns = {3: 'Flag'})

##Loop to find matches
i = 0

while i <= 2:
    df['Matches'] = df[i].equals(df['Flag'])
    i += 1

Мой мыслительный процесс состоит в том, чтобы перебирать каждый столбец с именем 0 - 2, проверять, совпадают ли строковые значения между 'Flag' и столбцами 0-2. Затем верните, если они совпадают или нет. Я не совсем уверен, что будет лучшим способом сохранить результат матча.

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

Я предоставил примерный кадр, в котором должно быть несколько совпадений, если я могу выполнить это правильно.

Спасибо за любую помощь.

1 Ответ

2 голосов
/ 22 мая 2019

Вы можете использовать iloc в сочетании с eq, чтобы вернуть строку, если любой столбцов совпадает с .any:

m = df.iloc[:, :-1].eq(df['Flag'], axis=0).any(axis=1)

df['indicator'] = m

     0    1    2 Flag  indicator
0  123  456  789  123       True
1  357  125  234  863      False
2  168  298  573  298       True
3  123  234  573  902      False

Результат, который вы получите обратно, вы можете выбрать путем логического индексирования:

df.iloc[:, :-1].eq(df['Flag'], axis=0)

       0      1      2
0   True  False  False
1  False  False  False
2  False   True  False
3  False  False  False

Тогда, если мы объединим его в цепочку с помощью any:

df.iloc[:, :-1].eq(df['Flag'], axis=0).any(axis=1)
0     True
1    False
2     True
3    False
dtype: bool
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...