Python df.rename не всегда работает - PullRequest
0 голосов
/ 07 мая 2018

У меня есть список фреймов данных, и я перебираю их, переименовывая все столбцы / индексы, используя один метод pandas df.rename.

df.rename(
    {
        'vol': 'Volume Sales',
        'val': 'Value Sales',
    },
    index={
        't1': info['literal_periods'][0],
        't2': info['literal_periods'][1],
        'acv': '% ACV Distribution',
        'aic': 'Average Items Carried',
        'tdp': 'Total Distribution Points',
        'vol': 'Volume Sales',
        'psl': 'Promo Sales',
        'Share of AIC': '{} share of {} AIC'.format(
            info['name'], info['p1']),
        'Share of TDP': '{} share of {} TDP'.format(
            info['name'], info['p1']),
        'Target Product': info['name'],
        'target product': info['name'],
    },
    columns={
        't1':
        info['literal_periods'][0],
        't2':
        info['literal_periods'][1],
        'promo change':
        '% change from ya',
        'non promo change':
        '% change from ya',
        'sales change':
        '% change from ya',
        'val':
        'Value Sales (£)',
        'vol':
        'Volume Sales (L)',
        'volsu':
        'Volume Sales (units)',
        'litres per unit':
        'litres/unit',
        't2 Promo Sales':
        '{} Promo Sales'.format(info['literal_periods'][1]),
        't2 Non-Promo Sales':
        '{} Non Promo Sales'.format(info['literal_periods'][1]),
        't2 Total Sales':
        '{} Total Sales'.format(info['literal_periods'][1])
    },
    inplace=True)

Кажется, что он отлично работает для некоторых таблиц, частично для других, а для некоторых совсем не работает. У кого-нибудь есть идея, почему это может быть? Например, индекс aic не переименовывается должным образом в df с aic в нем, даже если столбец «vol» правильно отображается в «Volume Sales» в том же df ...

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Согласно документации Pandas по переименованию , где поясняются параметры mapper, index, columns, написано:

Используйте либо маппер и ось , чтобы указать ось для цели с маппером, либо индекс и столбцы

В том, что вы приводите в качестве примера,

{
    'vol': 'Volume Sales',
    'val': 'Value Sales',
}

, который понимается функцией как mapper =, а затем вы даете index и columns. Не имея возможности воспроизвести, возможно, что у функции rename есть некоторые "проблемы" с пониманием параметров, которые вы задаете (я думаю, что просмотр кода даст причину)

Это также объясняет, почему столбец 'vol' переименовывается 'Volume Sales', а не 'Volume Sales (L)', как определено в column=

0 голосов
/ 07 мая 2018

Проблема была в первых нескольких строках:

df.rename(
    {
        'vol': 'Volume Sales',
        'val': 'Value Sales',
    },

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

...