Лучший способ создать маскировку фиктивных переменных? - PullRequest
0 голосов
/ 01 июня 2018

Так, например, у меня есть DataFrame pandas, который содержит столбец названий городов, и у меня уже есть большой предопределенный список названий городов, которые будут использоваться в качестве фиктивных переменных в модели.Я хотел бы, чтобы каждое название города в списке было добавлено в виде нового столбца, а затем заполнено связкой нулей и единиц, где строка в столбце названия города совпадает с именем столбца фиктивной переменной.

С моей точки зрения, мне нужно было бы сделать что-то вроде:

for dv in dummy_var_list:
    df[dv] = df[df[city_names]==dv]

Я не уверен, будет ли это эффективным или правильным подходом.Мне нужно было бы включить какое-то утверждение или маскировку «если», в которых я не уверен, как это сделать.

т.е. у меня есть список названий городов:

['paris','sydney','orlando','milwaukee']

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

['tokyo','berlin','beijing','orlando','paris']

Таким образом, в некоторых строках не будет никаких '1', потому что совпадений нет, но это нормально.

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Вы можете сделать это:

import numpy as np

df = pd.DataFrame(columns=['tokyo','berlin','beijing','orlando','paris'])
df['city'] = ['paris','sydney','orlando','milwaukee']

Начальный df:

  tokyo berlin beijing orlando paris       city
0   NaN    NaN     NaN     NaN   NaN      paris
1   NaN    NaN     NaN     NaN   NaN     sydney
2   NaN    NaN     NaN     NaN   NaN    orlando
3   NaN    NaN     NaN     NaN   NaN  milwaukee

for col in df.columns:
    df.loc[df['city'] == col, col] = 1
df = df.replace(np.NaN, 0)

Вывод:

   tokyo  berlin  beijing  orlando  paris       city
0      0       0        0        0      1      paris
1      0       0        0        0      0     sydney
2      0       0        0        1      0    orlando
3      0       0        0        0      0  milwaukee
0 голосов
/ 01 июня 2018

Если вас интересуют только определенные города, вы можете просто взять подмножество вашего фрейма данных, в котором содержатся интересующие вас города, взять фиктивные столбцы этого с помощью pd.dummies, а затем присоединиться к исходному фрейму данных:

>>> df
  city_names
0      Paris
1   New York
2      Paris
3      Tokyo
4   New York

dummy_var_list = ['Paris', 'New York']

dummy_df = df.join(pd.get_dummies(df.loc[df.city_names.isin(dummy_var_list)], 
                   prefix='', prefix_sep='')).fillna(0)

>>> dummy_df
  city_names  New York  Paris
0      Paris       0.0    1.0
1   New York       1.0    0.0
2      Paris       0.0    1.0
3      Tokyo       0.0    0.0
4   New York       1.0    0.0

Редактировать : Если я правильно понимаю, вам нужен фиктивный столбец для всех ваших городов в dummy_var_list, даже если они не отображаются в city_names в вашем оригиналеdf.В этом случае, после кода выше, вы можете выполнить цикл и добавить столбец нулей для городов, которые не отображаются:

>>> df
  city_names
0      Paris
1   New York
2      Paris
3      Tokyo
4   New York

dummy_var_list = ['Paris', 'New York', 'Los Angeles']

dummy_df = df.join(pd.get_dummies(df.loc[df.city_names.isin(dummy_var_list)], 
        prefix='', prefix_sep='')).fillna(0)

for i in dummy_var_list:
    if i not in dummy_df.columns:
        dummy_df[i] = 0 

>>> dummy_df
  city_names  New York  Paris  Los Angeles
0      Paris       0.0    1.0            0
1   New York       1.0    0.0            0
2      Paris       0.0    1.0            0
3      Tokyo       0.0    0.0            0
4   New York       1.0    0.0            0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...