#python #pandas #dataframe #explode
#python #pandas #фрейм данных #взорваться
Вопрос:
У меня есть фрейм данных, который выглядит следующим образом:
import pandas as pd
df = pd.DataFrame({'a':[1,2,3], 'b':[[1,2,3],[1,2,3],[1,2,3]], 'c': [[4,5,6],[4,5,6],[4,5,6]]})
Я хочу разбить фрейм данных на столбцы b и c. Я знаю, что если мы используем только один столбец, то мы можем сделать
df.explode('column_name')
Однако я не могу найти способ использовать с двумя столбцами. Итак, вот желаемый результат.
output = pd.DataFrame({'a':[1,1,1,2,2,2,3,3,3], 'b':[1,2,3,1,2,3,1,2,3], 'c': [4,5,6,4,5,6,4,5,6]})
Я пытался
df.explode(['a','b'])
но это не работает и дает мне
ValueError: column must be a scalar.
Спасибо.
Ответ №1:
Давайте попробуем
df=pd.concat([df[x].explode() for x in ['b','c']],axis=1).join(df[['a']]).reindex(columns=df.columns)
Out[179]:
a b c
0 1 1 4
0 1 2 5
0 1 3 6
1 2 1 4
1 2 2 5
1 2 3 6
2 3 1 4
2 3 2 5
2 3 3 6
Ответ №2:
Вы можете использовать цепочку itertools вместе с zip для получения нужного результата :
pd.DataFrame(chain.from_iterable(zip([a] * df.shape[-1], b, c)
for a, b, c in df.to_numpy()))
0 1 2
0 1 1 4
1 1 2 5
2 1 3 6
3 2 1 4
4 2 2 5
5 2 3 6
6 3 1 4
7 3 2 5
8 3 3 6
Ответ №3:
Понимание списка от @Ben происходит быстрее всего. Однако, если вы не слишком заботитесь о скорости, вы можете использовать apply
с pd.Series.explode
df.set_index('a').apply(pd.Series.explode).reset_index()
Или просто apply
. Для столбцов, не входящих в список, он вернет исходные значения
df.apply(pd.Series.explode).reset_index(drop=True)
Out[42]:
a b c
0 1 1 4
1 1 2 5
2 1 3 6
3 2 1 4
4 2 2 5
5 2 3 6
6 3 1 4
7 3 2 5
8 3 3 6