pythoni c способ создания фиктивного столбца из суммы двух значений - PullRequest
0 голосов
/ 07 марта 2020

У меня есть фрейм данных с одним столбцом с именем label, который имеет значения [0,1,2,3,4,5,6,8,9]. Я хотел бы сделать из этого фиктивные столбцы, но я бы хотел, чтобы некоторые метки были соединены вместе, поэтому, например, я хочу, чтобы dummy_012 было равно 1, если у наблюдения есть метка 0, 1 или 2.

Если я использую команду df2 = pd.get_dummies(df, columns=['label']), это создаст 9 столбцов, по 1 для каждой метки.

Я знаю, что могу использовать df2['dummy_012']=df2['dummy_0']+df2['dummy_1']+df2['dummy_2'] после этого, чтобы превратить его в один объединенный столбец, но я хочу знать, если есть более питонский c способ сделать это (или некоторую функцию, где я могу просто изменить параметры для объединений).

Ответы [ 2 ]

0 голосов
/ 07 марта 2020

Я не знаю, что это Pythoni c, потому что может существовать более элегантное решение, но я разрешаю вам изменять параметры, и оно векторизовано. Я читал, что get_dummies () может быть немного медленным с большими объемами данных, и векторизация pandas является хорошей практикой в ​​целом. Таким образом, я векторизовал эту функцию и заставил ее выполнять вычисления с массивами numpy. Это должно повысить производительность при увеличении размера набора данных по сравнению с аналогичными функциями.

Эта функция примет ваш фрейм данных и список чисел в виде строк и вернет ваш фрейм данных с нужным вам столбцом.

def get_dummy(df,column_nos):
    new_col_name = 'dummy_'+''.join([i for i in column_nos])
    vector_sum = sum([df[i].values for i in column_nos])
    df[new_col_name] = [1 if i>0 else 0 for i in vector_sum]

    return df

Если вы хотите, чтобы ввод был целыми числами, а не строками, вы можете настроить вышеуказанную функцию так, как показано ниже.

def get_dummy(df,column_nos):
    column_names = ['dummy_'+str(i) for i in column_nos]
    new_col_name = 'dummy_'+''.join([str(i) for i in sorted(column_nos)])

    vector_sum = sum([df[i].values for i in column_names])
    df[new_col_name] = [1 if i>0 else 0 for i in vector_sum]

    return df
0 голосов
/ 07 марта 2020

Может быть, этот подход может дать представление:

groups = ['012', '345', '6789']
for gp in groups:
    df.loc[df['Label'].isin([int(x) for x in gp]), 'Label_Group'] = f'dummies_{gp}'

Вывод:

   Label   Label_Group
0      0   dummies_012
1      1   dummies_012
2      2   dummies_012
3      3   dummies_345
4      4   dummies_345
5      5   dummies_345
6      6  dummies_6789
7      8  dummies_6789
8      9  dummies_6789

А затем применить пустышку:

df_dummies = pd.get_dummies(df['Label_Group'])
   dummies_012  dummies_345  dummies_6789
0            1            0             0
1            1            0             0
2            1            0             0
3            0            1             0
4            0            1             0
5            0            1             0
6            0            0             1
7            0            0             1
8            0            0             1
...