Как разнести столбцы в фрейме данных, в котором есть полный список для каждой строки, которую необходимо разнести в панд?

#python #pandas #dataframe

Вопрос:

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

 ex = [{"A": "Germany", "word": "Danke", "explode1": [["berlin", "frankfurt"], ["Paris"], ["London", "Glassgow"]], "explode2": [["food", "cars"], ["fashion"], ["pound", "cricket"]]}, 
  {"A": "French", "word": "merci", "explode1": [["berlin", "frankfurt"], ["Paris"], ["London", "Glassgow"]], "explode2": [["food", "cars"], ["fashion"], ["pound", "cricket"]]}, 
  {"A": "English", "word": "Thank you", "explode1": [["berlin", "frankfurt"], ["Paris"], ["London", "Glassgow"]], "explode2": [["food", "cars"], ["fashion"], ["pound", "cricket"]]}]

df = pd.DataFrame(ex)

A       word        explode1                                            explode2
Germany Danke       [[berlin, frankfurt], [Paris], [London, Glassgow]]  [[food, cars], [fashion], [pound, cricket]]
French  merci       [[berlin, frankfurt], [Paris], [London, Glassgow]]  [[food, cars], [fashion], [pound, cricket]]
English Thank you   [[berlin, frankfurt], [Paris], [London, Glassgow]]  [[food, cars], [fashion], [pound, cricket]]
 

Я хочу взорвать фрейм данных на основе столбцов «explode1» и «explode2». Если вы заметили, что у них одинаковое количество элементов списка, т. Е.:3, но список содержит все элементы для строк. Поэтому я хочу разорвать фрейм данных, чтобы он выглядел примерно так:

 A       word        explode1    explode2
Germany Danke       [berlin]    [food]
Germany Danke       [frankfurt] [cars]
French  merci       [Paris]     [fashion]
English Thank you   [London]    [pound]
English Thank you   [Glassgow]  [cricket]
 

Как мне это сделать? Рассматривал вариант pandas.explode, но как мы обрабатываем полный список в каждой строке, потому что, например: я хочу, чтобы первая строка расширялась только на основе первого элемента списка в столбце «explode1» и «explode2», а не на других элементах списка.

Ответ №1:

explode на самом деле это не сработает, так как элементы списка сначала должны быть объединены по индексу. Возможный рабочий процесс, чтобы сначала это сделать , а затем продолжить to_explode , наконец, создав новый df с помощью concat :

 import pandas as pd 

ex = [{"A": "Germany", "word": "Danke", "explode1": [["berlin", "frankfurt"], ["Paris"], ["London", "Glassgow"]], "explode2": [["food", "cars"], ["fashion"], ["pound", "cricket"]]}, 
  {"A": "French", "word": "merci", "explode1": [["berlin", "frankfurt"], ["Paris"], ["London", "Glassgow"]], "explode2": [["food", "cars"], ["fashion"], ["pound", "cricket"]]}, 
  {"A": "English", "word": "Thank you", "explode1": [["berlin", "frankfurt"], ["Paris"], ["London", "Glassgow"]], "explode2": [["food", "cars"], ["fashion"], ["pound", "cricket"]]}]

df = pd.DataFrame(ex)

df['to_explode'] = df.apply(lambda row: list(zip(row['explode1'][row.name], row['explode2'][row.name])), axis=1)
df = df[['A', 'word', 'to_explode']].explode('to_explode').reset_index(drop=True)

result_df = pd.concat([df[['A', 'word']], pd.DataFrame(df['to_explode'].values.tolist(), columns=['explode1', 'explode2'])], axis=1)
 

Результат:

A слово взрыв1 взрыв2
0 Германия Danke berlin Еда
1 Германия Danke frankfurt Автомобили
2 Французский merci Париж Мода
3 Английский Спасибо Лондон фунт
4 Английский Спасибо Стеклянный колпак крикет

Комментарии:

1. Это работает очень хорошо. Спасибо вам за подход и объяснение.