Python Сравнить содержимое фрейма и заменить, если совпадают? - PullRequest
0 голосов
/ 18 декабря 2018

Я работаю над небольшой программой, как практика на python, и мне нужна помощь, чтобы попытаться сравнить два столбца в фрейме данных и заменить содержимое одного на другое.Я могу видеть свои результаты, поскольку я преобразовал фрейм данных в Excel.

В любом случае, я хочу сравнить два столбца Location и Abbrev на основе первых трех букв каждого из них, а затем заменить на сокращение.,Поэтому столбец LON в Abbrev следует сравнивать с первыми тремя буквами в London .Столбец Abbrev содержит только один экземпляр сокращения.

Поэтому я начинаю с:

Team         Location    GameDay   Abbrev
Arsenal      London      2/14      LON
Liverpool    Liverpool   2/14      LIV
Manchester   Manchester  2/16      MAN
Arsenal      London      2/23      NEW
Newcastle    Manchester  2/16      LEE

и хочу получить следующие выходные данные:

Team        Location  GameDay   Abbrev
Arsenal     LON       2/14      LON
Liverpool   LIV       2/14      LIV
Manchester  MAN       2/16      MAN
Arsenal     LON       2/23      NEW
Newcastle   MAN       2/16      LEE

Однакосейчас я получаю только полную замену столбцов независимо от соответствия.

Team        Location    GameDay   Abbrev
Arsenal     LON         2/14      LON
Liverpool   LIV         2/14      LIV
Manchester  MAN         2/16      MAN
Arsenal     NEW         2/23      NEW
Newcastle   LEE         2/16      LEE

Это фрагмент кода, который у меня есть.

df['Location'] = df.apply(lambda row: row['Abbrev'] 
                          if row['Location'][:3].upper() != row['Abbrev'] 
                          else row['Abbrev'],axis=1)

Я хотел бы помочь выяснить, что не так с моим кодом.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Не уверен, что я на 100% понимаю, но на основании только примеров данных, которые вы могли бы сделать:

df['Location'] = df['Location'].str[:3].str.upper()

Но похоже, что вы хотите, чтобы местоположение было заполнено только значениями из Abbrev, выне говорите, что вы хотите, чтобы поведение было, если значение не в Abbrev, поэтому я буду считать NaN:

# Map to first 3 letters
df['Location'] = df['Location'].str[:3].str.upper()
# null out values not in Abbrev
df.loc[~df['Location'].isin(df['Abbrev']), 'Location'] = np.nan
0 голосов
/ 18 декабря 2018

Вам нужно проверить, если row['Location'][:3] в сокращениях:

import pandas as pd

data = [['Arsenal', 'London', '2/14', 'LON'],
        ['Liverpool', 'Liverpool', '2/14', 'LIV'],
        ['Manchester', 'Manchester', '2/16', 'MAN'],
        ['Arsenal', 'London', '2/23', 'NEW'],
        ['Newcastle', 'Manchester', '2/16', 'LEE']]

df = pd.DataFrame(data=data, columns=['Team', 'Location', 'GameDay', 'Abbrev'])

abbreviations = set(df.Abbrev.values)
df['Location'] = df.apply(lambda row: row['Location'][:3].upper() if row['Location'][:3].upper() in abbreviations else row['Abbrev'], axis=1)

print(df)

Выход

         Team Location GameDay Abbrev
0     Arsenal      LON    2/14    LON
1   Liverpool      LIV    2/14    LIV
2  Manchester      MAN    2/16    MAN
3     Arsenal      LON    2/23    NEW
4   Newcastle      MAN    2/16    LEE

ОБНОВЛЕНИЕ

Если вы предпочитаете однострочник:

df['Location'] = df.apply(lambda row: row['Location'][:3].upper() if row['Location'][:3].upper() in df.Abbrev.values else row['Abbrev'], axis=1)
...