python назначить переменные из значений в списке - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть CSV-файл, который я импортирую в виде списка

[["df['EPS Rating']>=97"],
 ["df['RS Rating']>=97"],
 ["df['Ind Group RS']<=9"],
 ["df['SMR Rating']<=2"],
 ["df['AD Rating']<=9"],
 ["df['Comp Rating']>=85"],
 ["df['Current Price']>=15"]]

Я бы хотел присвоить каждому из них переменные от c1 до c7 следующим образом

c1 = df['EPS Rating']>=97
c2 = df['RS Rating']>=97
c3 = df['Ind Group RS']<=9
c4 = df['SMR Rating']<=2
c5 = df['AD Rating']<=9
c6 = df['Comp Rating']>=85
c7 = df['Current Price']>=15

Это так что я могу использовать это отличное решение, которое нашел Gecko здесь , также показанное ниже. В то время как в моем случае это решение отлично подходит для чтения, оно оказывается огромным, поскольку у меня более 30 таких фильтров и многие из них имеют более 20 условий. Как я могу назначить строки в списке переменным?

что-то вроде этого может быть?

For i to end_of_list:
    c[i] = [i].value

Надеюсь, это объясняет, что я пытаюсь сделать. Я новичок в python, поэтому я все еще немного растерялся. Я не привязан к этой идее, поэтому, если у кого-то есть лучшее решение, я бы хотел его узнать. Спасибо

Geckos Оригинальное решение:

import numpy as np
import functools
def conjunction(*conditions):
    return functools.reduce(np.logical_and, conditions)

c_1 = data.col1 == True
c_2 = data.col2 < 64
c_3 = data.col3 != 4

data_filtered = data[conjunction(c1,c2,c3)]

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Попробуйте:

strings = [["df['EPS Rating']>=97"],
 ["df['RS Rating']>=97"],
 ["df['Ind Group RS']<=9"],
 ["df['SMR Rating']<=2"],
 ["df['AD Rating']<=9"],
 ["df['Comp Rating']>=85"],
 ["df['Current Price']>=15"]]

filters = []
for i in strings:
    filters.append(eval(i[0]))

data_filtered = df[conjunction(*filters)]

Вы можете передать этой функции conjunction список, если распакуете его вместо , как здесь.

Примечание: это предполагает, что у вас есть фактический объект DataFrame df, инициализированный где-то в вашем коде до запуска.


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

for i in range(len(g)):
    x = 'c_{}'.format(i)
    exec('{} = {}'.format(x,g[i][0].strip("\"")))

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

1 голос
/ 25 февраля 2020

IIU C, вы можете просто держать каждый элемент в словаре.

filter_dict = {}
counter = 1
for item in your_list:
    for i in item:
        filter_dict[f'C{counter}'] = i 
        counter += 1

print(filter_dict)

{'C1': "df['EPS Rating']>=97",
 'C2': "df['RS Rating']>=97",
 'C3': "df['Ind Group RS']<=9",
 'C4': "df['SMR Rating']<=2",
 'C5': "df['AD Rating']<=9",
 'C6': "df['Comp Rating']>=85",
 'C7': "df['Current Price']>=15"}

это дает вам строковую версию вашего объекта, вам придется использовать eval для используйте его в своей функции.

import numpy as np
import functools

def conjunction(*conditions):
    return functools.reduce(np.logical_and, conditions)



df[conjunction([eval(x) for x in filter_dict.values()])

Обратите внимание, что eval вызовет ошибку, если объект не существует в вашем фрейме данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...