Удалить элементы словаря в цикле - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь проверить, какие столбцы в df всегда имеют одинаковое значение, и удалить их из словаря. Однако, даже если x1 и x2 должны быть удалены, этого не происходит.

data = [[0.1, 0.3, 0.2, 0.3, 0.4], [0.1, 0.3, 0.3, 0.6, 0.5], [0.1, 0.3, 0.8, 0.4, 0.3]]
df = pd.DataFrame(data, columns = ['x1', 'x2', 'x3', 'y1', 'y2']) 

vars1 = ["x1", "x2", "x3"]
vars2 = ["x1", "x3"]

vars_used = {"y1": vars1, "y2": vars2}

for ex_var in vars_used.get("y1"):
    if df[ex_var].value_counts(normalize=True).values.max() > np.float(0.999):
        vars_used.get("y1").remove(ex_var)

vars_used["y1"]

Вывод, который я получаю, - ['x2', 'x3'], а не ['x3']. Если я использую тот же код вне цикла, он работает нормально. Ищете простое решение для желаемого поведения.

Ответы [ 2 ]

1 голос
/ 01 октября 2019

Проблема:

for ex_var in vars_used.get("y1"):
    print(ex_var)
    if df[ex_var].value_counts(normalize=True).values.max() > np.float(0.999):
        vars_used.get("y1").remove(ex_var)

x1
x3

, как вы можете видеть, x2 никогда не тестировался, это происходит потому, что вы удаляете x1 из цикла

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

remove_list=[]
for ex_var in vars_used.get("y1"):
    if df[ex_var].value_counts(normalize=True).values.max() > np.float(0.999):
        remove_list.append(ex_var)

[vars_used.get("y1").remove(key) for key in remove_list]
vars_used["y1"]

Вывод:

['x3']

элегантное решение:

same_value=[*df.columns[df.nunique().eq(1)]]
print(same_value)

['x1', 'x2']

for key in vars_used:  
    for value in same_value: 
        try:
            vars_used[key].remove(value)
        except:
            pass

print(vars_used)

{'y1': ['x3'], 'y2': ['x3']}
0 голосов
/ 01 октября 2019

вы можете сделать что-то вроде этого, вы знаете, если в столбце есть только 1 уникальное значение, то все они повторяются:

for col in df.columns:
    if len(df[col].unique())==1:
        vars_used['y1'].remove(col)

vars_used

{'y1': ['x3'], 'y2': ['x1', 'x3']}
...