Кадр данных задается как:
df = pd.DataFrame(
{
"id": [1, 2, 3, 4, 5, 6, 7, 8],
"parent_id": [0, 0, 1, 1, 2, 2, 4, 4],
"value": [a>2, b<4, d>5, e<3, h>1, i>10, f>3, g>2],
}
)
Мне нужно получить это строковое выражение:
"or(and (a > 2,
or(d > 5,
and (e<3,
or (f > 3,
g > 2)
)
)
),
and(b < 4,
or(h > 1,
i > 10)
)
)"
То есть все дочерние элементы должны быть параметрами функции «ИЛИ», а родительский элемент и его дочерние элементы должны быть параметрами функции «И».
@mozway, мне нужно получить строковое представление выражения, а не результат логического выражения
Что такое a
, b
и т. д. в первом фрагменте кода?
Учитывая отличные ответы, которые вы получили здесь , а также очевидное сходство с вашим текущим вопросом, поделитесь своей попыткой решить эту проблему. См. также исследовательские работы.
IIUC, вы можете использовать рекурсивную функцию, как в вашем предыдущем вопросе:
children = df.groupby('parent_id')['id'].agg(list).to_dict()
values = dict(zip(df['id'], df['value']))
def fold(c):
if isinstance(c, list):
return 'or(%s)' % ','.join(map(fold, c))
if c in children:
return f'and({values.get(c)},{fold(children.get(c))})'
return values.get(c)
out = fold(children[0]) # root
Выход:
or(and(a>2,or(d>5,and(e<3,or(f>3,g>2)))),and(b<4,or(h>1,i>10)))
Используемый вход:
df = pd.DataFrame(
{
'id': [1, 2, 3, 4, 5, 6, 7, 8],
'parent_id': [0, 0, 1, 1, 2, 2, 4, 4],
'value': ['a>2', 'b<4', 'd>5', 'e<3', 'h>1', 'i>10', 'f>3', 'g>2'],
}
)
Большое спасибо, @mozway!
Чем он отличается от вашего предыдущего вопроса?