Как обрабатывать различное написание имен столбцов при извлечении данных? - PullRequest
0 голосов
/ 27 февраля 2020

Для этого примера у меня есть 2 кадра данных, столбец жанра в df1 - это столбец 3, но в df2 это столбец 2, также заголовок немного отличается. в моем фактическом сценарии мне нужно искать имена столбцов, потому что расположение столбцов меняется на каждом листе, который он читает.

как мне распознать разные имена заголовков как одно и то же?

df1 = pd.DataFrame({'TITLE': ['The Matrix','Die Hard','Kill Bill'],
               'VENDOR ID': ['1234','4321','4132'],
               'GENRE(S)': ['Action', 'Adventure', 'Drama']})

df2 = pd.DataFrame({'TITLE': ['Toy Story','Shrek','Frozen'],
               'Genre': ['Animation', 'Adventure', 'Family'],
               'VENDOR ID': ['5678','8765','8576']})

column_names = ['TITLE','VENDOR ID','GENRE(S)']

appended_data = []

sheet1 = df1[df1.columns.intersection(column_names)]
appended_data.append(sheet1)
sheet2 = df2[df2.columns.intersection(column_names)]
appended_data.append(sheet2)

appended_data = pd.concat(appended_data, sort=False)

output:

        TITLE VENDOR ID   GENRE(S)
0  The Matrix      1234     Action
1    Die Hard      4321  Adventure
2   Kill Bill      4132      Drama
0   Toy Story      5678        NaN
1       Shrek      8765        NaN
2      Frozen      8576        NaN

desired output:

        TITLE VENDOR ID   GENRE(S)
0  The Matrix      1234     Action
1    Die Hard      4321  Adventure
2   Kill Bill      4132      Drama
0   Toy Story      5678  Animation
1       Shrek      8765  Adventure
2      Frozen      8576     Family

1 Ответ

0 голосов
/ 28 февраля 2020

Спасибо, что нашли время для этого. Задавать хорошие вопросы очень важно, и теперь, когда вы задали согласованный вопрос, я смог довольно быстро найти простое решение:

import pandas as pd

df1 = pd.DataFrame({'TITLE': ['The Matrix','Die Hard','Kill Bill'],
                'VENDOR ID': ['1234','4321','4132'],
                 'GENRE(S)': ['Action', 'Adventure', 'Drama']})

df2 = pd.DataFrame({'TITLE': ['Toy Story','Shrek','Frozen'],
                    'Genre': ['Animation', 'Adventure', 'Family'],
                'VENDOR ID': ['5678','8765','8576']})

Простой способ:
Мы будем используйте .append() ниже, но для этого нам нужны столбцы в df1 и df2 для соответствия. В этом случае мы просто заменим df2's 'Genre' на 'GENRE(S)'

df2.columns = ['TITLE', 'GENRE(S)', 'VENDOR ID']

df3 = df1.append(df2)
print(df3)

    GENRE(S)       TITLE VENDOR ID
0     Action  The Matrix      1234
1  Adventure    Die Hard      4321
2      Drama   Kill Bill      4132
0  Animation   Toy Story      5678
1  Adventure       Shrek      8765
2     Family      Frozen      8576

Более подробно:
Теперь, для одного варианта использования это работает, но есть могут быть случаи, когда у вас много несовпадающих столбцов и / или вам приходится делать это повторно. Вот решение, использующее логическое индексирование для поиска несовпадающих имен, затем zip() и .rename() для сопоставления имен столбцов:

# RELOAD YOUR ORIGINAL DF'S 

df1_find = df1.columns[~df1.columns.isin(df2.columns)] # select col name that isnt in df2
df2_find = df2.columns[~df2.columns.isin(df1.columns)] # select col name that isnt in df1

zipped = dict(zip(df2_find, df1_find)) # df2_find as key, df1_find as value

df2.rename(columns=zipped, inplace=True) # map zipped dict to the column names

df3 = df1.append(df2)
print(df3)

    GENRE(S)       TITLE VENDOR ID
0     Action  The Matrix      1234
1  Adventure    Die Hard      4321
2      Drama   Kill Bill      4132
0  Animation   Toy Story      5678
1  Adventure       Shrek      8765
2     Family      Frozen      8576

Имейте в виду:

  1. таким образом при этом предполагается, что оба ваших df имеют одинаковое количество столбцов
  2. это ТАКЖЕ предполагает, что df1 имеет ваши идеальные имена столбцов, которые вы будете использовать против других df s, чтобы исправить их имена столбцов

Надеюсь, это поможет.

...