Удаление списка в рамках Pandas Dataframe - PullRequest
0 голосов
/ 13 января 2019

У меня есть следующий фрейм данных:

Index   Recipe_ID   order   content
0       1285        1       Heat oil in a large frypan with lid over mediu...
1       1285        2       Meanwhile, add cauliflower to a pot of boiling...
2       1285        3       Remove lid from chicken and let simmer uncover... 
3       1289        1       To make the dressing, whisk oil, vinegar and m...
4       1289        2       Cook potatoes in a large saucepan of boiling w..

Задача: мне нужно получить содержимое в одну ячейку:

df = df.groupby('recipe_variation_part_id', as_index=False).agg(lambda x: x.tolist())

Возвращает следующее:

Index   Recipe_ID   order         content
0       1285        [1, 2, 3]     [Heat oil in a large frypan with lid over medi...
1       1289        [1, 2, 3]     [To make the dressing, whisk oil, vinegar and ...
2       1297        [1, 2, 4, 3]  [Place egg in saucepan of cold water and bring...
3       1301        [1, 2]        [Preheat a non-stick frying pan and pan fry th...
4       1309        [2, 3, 4, 1]  [Meanwhile, cook noodles according to package ...

Если вы посмотрите на первую запись рецепта, вы получите следующее:

['Heat oil in a large frypan with lid over medium-high heat. Cook onions, garlic and rosemary for a couple of minutes until soft. Add chicken and brown on both sides for a few minutes, then add in tomatoes and olives. Season with salt and pepper and allow to simmer with lid on for 20-25 minutes. ',
 'Meanwhile, add cauliflower to a pot of boiling water and cook for 10 minutes or until soft. Drain and then mash and gently fold in olive oil, parmesan, salt and pepper. ',
 'Remove lid from chicken and let simmer uncovered for five minutes more. Sprinkle with parsley then serve with cauliflower mash. ']

Это то, что я хочу, но мне нужно снять квадратные скобки

dtype = list

Я пробовал:

df.applymap(lambda x: x[0] if isinstance(x, list) else x)

возвращает только первую запись, а не каждый шаг

Я пробовал:

df['content'].str.replace(']', '')

Возвращает только NAN

Я пробовал:

df['content'].str.replace(r'(\[\[(?:[^\]|]*\|)?([^\]|]*)\]\])', '')

Возвращает только NAN

Я пробовал:

df['content'].str.get(0)

возвращает только первую запись

Любая помощь будет принята с благодарностью.

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

1 Ответ

0 голосов
/ 13 января 2019

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

import pandas as pd
df = pd.DataFrame({'order': [1, 1, 2], 'content': ['hello', 'world', 'sof']})
df
Out[4]: 
   order content
0      1   hello
1      1   world
2      2     sof
df.groupby(by=['order']).agg(lambda x: ' '.join(x))
Out[5]: 
           content
order             
1      hello world
2              sof

Так же, как вы делаете в 5-й строке в своем вопросе, вы используете ' '.join(x) вместо tolist(), который будет помещать все как 1 большую строку вместо списка строк, поэтому нет []

...