Как использовать два столбца для различения точек данных во фрейме данных pandas

#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