Как удалить повторяющиеся столбцы, сгенерированные после использования pd.get_dummies, используя их дисперсию в качестве отсечки - PullRequest
0 голосов
/ 31 августа 2018

У меня есть фрейм данных, который генерируется с использованием pd.get_dummies, как показано ниже:

df_target = pd.get_dummies(df_column[column], dummy_na=True,prefix=column)

где столбец - это имя столбца, а df_column - кадр данных, из которого извлекается каждый столбец для выполнения некоторых операций.

rev_grp_m2_> 225    rev_grp_m2_nan  rev_grp_m2_nan
0                       0                   0
0                       0                   0
0                       0                   0
0                       0                   0
0                       0                   0
0                       0                   0
0                       0                   0
1                       0                   0
0                       0                   0
0                       0                   0
0                       0                   0
0                       0                   0

Теперь я проверяю дисперсию для каждого сгенерированного столбца и пропускаю столбцы с нулевой дисперсией.

for target_column in list(df_target.columns):
    # If variance of the dummy created is zero : append it to a list and print to log file.
    if ((np.var(df_target_attribute[[target_column]])[0] != 0)==True):
        df_final[target_column] = df_target[target_column]

Здесь из-за того, что два столбца совпадают, я получаю ключевую ошибку для строки np.var. Существует два значения дисперсии для столбца nan:

erev_grp_m2_nan    0.000819
rev_grp_m2_nan    0.000000

В идеале я хотел бы взять тот с ненулевой дисперсией и пропустить / пропустить тот с 0 вар.

Может кто-нибудь, пожалуйста, помогите мне сделать это?

1 Ответ

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

Для DataFrame.var использование:

print (df.var())
rev_grp_m2_> 225    0.083333
rev_grp_m2_nan      0.000000
rev_grp_m2_nan      0.000000

Последний для фильтрации используется boolean indexing:

out = df.loc[:, df.var()!= 0]
print (out)
    rev_grp_m2_> 225
0                  0
1                  0
2                  0
3                  0
4                  0
5                  0
6                  0
7                  1
8                  0
9                  0
10                 0
11                 0

РЕДАКТИРОВАТЬ: Вы можете получить индексы, отличные от 0, а затем выбрать iloc:

cols = [i for i in np.arange(len(df.columns)) if np.var(df.iloc[:, i]) != 0]
print (cols)
[0]

df = df.iloc[:, cols]
print (df)
    rev_grp_m2_> 225
0                  0
1                  0
2                  0
3                  0
4                  0
5                  0
6                  0
7                  1
8                  0
9                  0
10                 0
11                 0

Другая идея - отфильтровать, если все значения 0:

cols = [i for i in np.arange(len(df.columns)) if (df.iloc[:, i] != 0).any()]
out = df.iloc[:, cols]

Или:

out = df.loc[:, (df != 0).any()]
print (out)
    rev_grp_m2_> 225
0                  0
1                  0
2                  0
3                  0
4                  0
5                  0
6                  0
7                  1
8                  0
9                  0
10                 0
11                 0
...