Условное позиционное сравнение списков на основе - PullRequest
0 голосов
/ 02 октября 2019

Я недавно задавал похожий вопрос, но сообщение об ошибке и проблема немного изменились.

Я хотел бы создать несколько списков, которые зависят от предыдущего списка, основываясь на положении элементов в каждом списке

Так, например, список 1 будет читать конкретный файл и возвращать либо число, либо логическое ложное значение на основе сравнения.

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

Примеры фреймов данных:

a = pd.DataFrame([0,0.9,0.6,0.7,0.8])
b = pd.DataFrame([0.7,0.51,0.3,0.7,0.2])

Я создал функцию, которая выполняет эти сравнения и создает список

def generic_state_machine(file,obs_nums):
    return file.ix[:,0][obs_nums] if file.ix[:,0][obs_nums] > 0.2 else False

obs_nums в этом контексте относится к позиции элемента в списке

Затем я создал списки, которые выглядятв разных файлах

session_to_leads = []
lead_to_opps = []

for i in range(1,len(a)):
     session_to_leads.append(generic_state_machine(file=a,obs_nums=i))
     lead_to_opps.append(generic_state_machine(file=b,obs_nums=i)) if session_to_leads != False else lead_to_opps.append(False)

Мне удалось разобраться с первоначальной ошибкой, с которой я столкнулся, единственная проблема сейчас заключается в том, что списокlead_to_opps не зависит от session_to_leads, поэтому, если в позиции 1 есть значение False, lead_to_opps не будет автоматически возвращать False в той же позиции. Итак, если предположить, что random.uniform (0,1) генерирует 0.5 все время, это мой текущий результат:

session_to_leads = [False,0.9,0.6,0.7,0.8]
lead_to_opps = [0.7,0.51,False,0.7,False]

Это мой желаемый результат:

session_to_leads = [False,0.9,0.6,0.7,0.8]
lead_to_opps = [False,0.51,False,0.7,False]

1 Ответ

0 голосов
/ 03 октября 2019

Возможно, я не понимаю ваше требование, и ваше намерение неясно. Вы уже создали кадры данных из списка. Вам просто нужно работать непосредственно с фреймами данных a и b. Здесь этот способ работает с фреймами данных a и b

m = a > 0.2
session_to_leads = a.where(a > 0.2, False)[0].to_list()

Out[755]: [False, 0.9, 0.6, 0.7, 0.8]

Получив session_to_leads, используйте то же условие для b в сочетании с условием m

lead_to_opps = b.where((b > 0.2) & m, False)[0].to_list()
Out[769]: [False, 0.51, 0.3, 0.7, False]

Примечание : 3-й элемент lead_to_opps равен 0.3 вместо False, как в желаемом выходе, поскольку условие > 0.2 и True в session_to_leads

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