Как переименовать указанные c столбцы в одном фрейме данных на основе другого - PullRequest
2 голосов
/ 22 апреля 2020

У меня есть один фрейм данных следующим образом:

df1: ACCOUNT_NAME Units GM 1. Sejal 12 12 2. Mohata 10 15

И еще один фрейм данных:

df2: INPUT_FIELD TRANSL 1. ACCOUNT_NAME Account Name 2. GM Gross Margin 3. REVENUE Revenue 4. BU Business Unit

Я хочу переименовать столбцы df1 к значениям TRANSL в df2, если значения присутствуют в INPUT_FIELD.

Я попытался: df1.columns = df1.columns.map(df2.set_index('INPUT_FIELD')['TRANSL'].get)

Переименовывает столбцы как: ['Account Name', None , 'Валовая маржа']

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

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Вы можете использовать Series.to_dict метод для преобразования серии df2["TRANSL"] в словарь mappings, а затем вы можете использовать DataFrame.rename метод для переименования столбцов df1, передав mappings dict аргументу columns метода rename.

Использование:

mappings = df2.set_index("INPUT_FIELD")["TRANSL"].to_dict()
df1.rename(columns=mappings, inplace=True)
print(df1)

Это печатает:

  Account Name  Units  Gross Margin
0        Sejal     12            12
1       Mohata     10            15
0 голосов
/ 22 апреля 2020

Вы можете легко построить понимание dict из df2.values:

df1.rename(columns={i:j for i,j in df2.values})

дает:

    Account Name  Units  Gross Margin
1.0        Sejal     12            12
2.0       Mohata     10            15

Переименование также принимает функцию отображения, поэтому вы можете использовать:

def mapper(x):
    trans = df2.loc[df2.INPUT_FIELD == x, 'TRANSL']
    return trans.iat[0] if len(trans)>0 else x
df1.rename(columns = mapper)

В моих тестах (с использованием timeit) он длиннее, чем диктат. Это быстрее, когда у вас есть более 1000 строк в df2 и когда имена столбцов находятся в первых строках, потому что тогда он не сканирует весь массив значений.

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