Переименование столбцов на фрагменте данных не работает должным образом - PullRequest
2 голосов
/ 24 мая 2019

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

Это не работает при попытке каким-либо образом заменить имена столбцов на фрагменте кадра данных, почему это так??

Допустим, у нас есть следующий фрейм данных:
Примечание , внизу - копируемый код для воспроизведения данных:

   Value ColAfjkj ColBhuqwa ColCouiqw
0      1        a         e         i
1      2        b         f         j
2      3        c         g         k
3      4        d         h         l

Я хочу очистить имена столбцов (ожидаемый вывод):

   Value ColA ColB ColC
0      1    a    e    i
1      2    b    f    j
2      3    c    g    k
3      4    d    h    l

Подход 1 :

Я могу получить чистый столбецимена, подобные этому:

df.iloc[:, 1:].columns.str[:4]

Index(['ColA', 'ColB', 'ColC'], dtype='object')

Или

Подход 2 :

s = df.iloc[:, 1:].columns
[col[:4] for col in s]

['ColA', 'ColB', 'ColC']

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

df.iloc[:, 1:].columns = df.iloc[:, 1:].columns.str[:4]

   Value ColAfjkj ColBhuqwa ColCouiqw
0      1        a         e         i
1      2        b         f         j
2      3        c         g         k
3      4        d         h         l

То же самое для второго подхода:

s = df.iloc[:, 1:].columns
cols = [col[:4] for col in s]

df.iloc[:, 1:].columns = cols

   Value ColAfjkj ColBhuqwa ColCouiqw
0      1        a         e         i
1      2        b         f         j
2      3        c         g         k
3      4        d         h         l

Это работает , но у вас естьвручную сопоставить имя первого столбца, что не идеально:

df.columns = ['Value'] + df.iloc[:, 1:].columns.str[:4].tolist()

   Value ColA ColB ColC
0      1    a    e    i
1      2    b    f    j
2      3    c    g    k
3      4    d    h    l

Есть ли более простой способ добиться этого?Я что-то упустил?


Кадр данных для воспроизведения:

df = pd.DataFrame({'Value':[1,2,3,4],
                   'ColAfjkj':['a', 'b', 'c', 'd'],
                   'ColBhuqwa':['e', 'f', 'g', 'h'],
                   'ColCouiqw':['i', 'j', 'k', 'l']})

Ответы [ 2 ]

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

Это потому, что индекс панд неизменен.Если вы проверите документацию для class pandas.Index, вы увидите, что она определена как:

Неизменяемый ndarray, реализующий упорядоченный, разрезаемый набор

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

df.columns = [df.columns[0]] + list(df.iloc[:, 1:].columns.str[:4])

Другой вариант - использовать rename со словарем, содержащим столбцы для замены:

df.rename(columns=dict(zip(df.columns[1:], df.columns[1:].str[:4])))
1 голос
/ 24 мая 2019

Для перезаписи имен столбцов вы можете использовать метод .rename ():

Итак, это будет выглядеть так:

df.rename(columns={'ColA_fjkj':'ColA',
                   'ColB_huqwa':'ColB',
                   'ColC_ouiqw':'ColC'}
          , inplace=True)

Подробнее о переименовать здесь, в документах: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.rename.html

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