#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. Это работает очень хорошо. Спасибо вам за подход и объяснение.