У меня есть фрейм данных с одной строкой, которая выглядит следующим образом:
a b c d e
1 [2,4] [2,7] apple orange
Я знаю, как это сделать с одним столбцом списка, но не был уверен, как это изменится с несколькими столбцами списка. По сути, я хочу расширить фрейм данных на n строк в зависимости от того, сколько элементов в каждом списке. Число всегда является эквивалентом между столбцами со списками. Таким образом, приведенный выше пример станет следующим:
a b c d e
1 2 2 apple orange
1 4 7 apple orange
Забавно, как простая проблема может быть сложной:
(pd.DataFrame(df.loc[0,['b','c']].to_list(), columns=['b','c'])
.join(df.loc[df.index.repeat(len(df.loc[0,'b'])),['a','d','e']].reset_index(drop=True))
)
Альтернативный способ использования explode для получения решения:
ndf = pd.concat([df.explode('c').drop('b', axis=1), df.explode('b').drop('c', axis=1)], axis=1)
ndf.loc[:,~ndf.columns.duplicated()]
Я не уверен, что это решение сработает для вашего реального dataframe. Мне кажется, что это работает только из-за простых данных примера.
import pandas as pd
import io
t = '''
a b c d e
1 [2,4,5] [2,7,2] apple orange'''
# Setting up the dataframe with lists in `b` and `c`.
df = pd.read_csv(io.StringIO(t), sep='\s+', converters = {'b': eval, 'c': eval})
df.apply(pd.Series.explode)
Вне:
a b c d e
0 1 2 2 apple orange
0 1 4 7 apple orange
0 1 5 2 apple orange
Если ваши списки имеют одинаковую длину, вы можете использовать конструктор pandas dataframe со словарем:
import pandas as pd
data = pd.Series([1, [2,4], [2,7], 'apple', 'orange'],
index=['a','b','c','d','e'])
data = pd.DataFrame(data).T
print(data, '\n\n')
output = pd.DataFrame(dict(zip(data.columns, data.loc[0])))
print(output)
a b c d e
0 1 [2, 4] [2, 7] apple orange
a b c d e
0 1 2 2 apple orange
1 1 4 7 apple orange
Забавно, как это работает. Я думал о том, чтобы сделать что-то подобное, но я подумал, что будет метод pandas, похожий на «взрыв», о котором я не знал. Спасибо чувак!