Как переименовать закодированные в горячем виде столбцы в пандах в соответствующие им индексы? - PullRequest
0 голосов
/ 30 августа 2018

Я горячо кодирую некоторые категориальные переменные с помощью некоторого кода, который был предоставлен мне. Эта строка добавляет столбец с нулями и единицами с именем в формате prefix_categoricalValue

dataframe = pandas.concat([dataframe,pandas.get_dummies(dataframe[0], prefix='protocol')],axis=1).drop([0],axis=1)

Я хочу, чтобы столбец имел в качестве имени индекс, а не prefix_categoricalValue.

Я знаю, что могу сделать что-то вроде df.rename(columns={'prefix_categoricalValue': '0'}, inplace=True), но я не уверен, как это сделать для всех столбцов, имеющих этот префикс.

enter image description here

Это пример части кадра данных. Независимо от того, решу я оставить префикс local_address или нет, у каждой категории будет свое имя. Можно ли переименовать столбец с его индексом?

EDIT:

Я пытаюсь сделать это:

for column in dataframe:
    dataframe.rename(columns={column: 'new_name'}, inplace=True)
        print (column)

но я не совсем уверен, почему это не работает

Ответы [ 3 ]

0 голосов
/ 30 августа 2018
import pandas as pd

# 'dataframe' is the name of your data frame in the question, so that's what I use
# in my code below, although I suggest using 'data' or something for it instead, 
# as 'DataFrame' is a keyword and its easy to make confusion. But anyway...

features = ['list of column names you want one-hot encoded']
# for example, features = ['Cars', 'Model, 'Year', ... ]

for f in features: 
    df = dataframe[[f]]

    df2 = (pd.get_dummies(df, prefix='', prefix_sep='')
                   .max(level=0, axis=1)
                   .add_prefix(f+' - '))  
    # the new feature names will be "<old_feature_name> - <categorical_value>"
    # for example, "Cars" will get transformed to "Cars - Minivan", "Cars - Truck", etc


    # add the new one-hot encoded column to the dataframe
    dataframe = pd.concat([dataframe, df2], axis=1)

    # you can remove the original columns, if you don't need them anymore (optional)
    dataframe = dataframe.drop([f], axis=1) 
0 голосов
/ 13 сентября 2018

Допустим, ваш префикс local_address_0.0.0.0. Следующий код переименовывает столбцы, начинающиеся с заданного вами префикса, в индекс, который столбец имеет в соответствии с порядком их появления в кадре данных:

prefix = 'local_address_0.0.0.0'
cols = list(dataframe)
for idx, val in enumerate(cols):
    if val.startswith(prefix):
        dataframe.rename(index=str, columns={val: idx}, inplace=True)

В консоли отобразится предупреждение:

python3.6/site-packages/pandas/core/frame.py:3027: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas- 
docs/stable/indexing.html#indexing-view-versus-copy
return super(DataFrame, self).rename(**kwargs)

Но это всего лишь предупреждение, имена столбцов информационного кадра обновляются. Если вы хотите узнать больше о предупреждении, см. Как работать с SettingWithCopyWarning в Pandas?

Если кто-то знает, как сделать то же самое без предупреждения, прокомментируйте.

0 голосов
/ 30 августа 2018

IIUC

dummydf=pd.get_dummies(df.A)
dummydf.columns=['A']*dummydf.shape[1]
dummydf
Out[1171]: 
   A  A
0  1  0
1  0  1
2  1  0
df
Out[1172]: 
   A  B  C
0  a  b  1
1  b  a  2
2  a  c  3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...