import pandas as pd
import numpy as np

df1 = pd.DataFrame({'col3':np.random.randint(1,10,5),'col1':np.random.randint(30,80,5)})
df2 = pd.DataFrame({'col4':np.random.randint(30,80,5),'col5':np.random.randint(100,130,5)})
df3 = pd.DataFrame({'col9':np.random.randint(1,10,5),'col8':np.random.randint(30,80,5)})

x1 = pd.concat([df1,df2,df3],axis=1,sort=False)
x1.columns = pd.MultiIndex.from_product([['I2'],x1.columns])
x2 = pd.concat([df1,df2,df3],axis=1,sort=False)
x2.columns = pd.MultiIndex.from_product([['I3'],x2.columns])
x3 = pd.concat([df1,df2,df3],axis=1,sort=False)
x3.columns = pd.MultiIndex.from_product([['I1'],x3.columns])

pd.concat([x1,x2,x3],axis=0,sort=False)

Я пытался получить агрегированный фрейм данных с точно таким же порядком столбцов, что и у x1, x2 и x3 (которые уже совпадают), как показано на рисунке 1 ниже:

Рисунок 1: Я пытался получить это

Но на самом деле приведенные выше коды создали фрейм данных, представленный на рисунке 2 ниже:

Рисунок 2: Код фактически создал это

  1. Мне интересно, почему параметр «sort = False» не смог успешно обработать поведение сортировки ни на первом уровне, ни на втором уровне столбцов в функции pandas.concat ()?
  2. Есть ли другой способ получить нужный фрейм данных?

Большое спасибо за ваше время и интеллект!

0
D.T. 18 Апр 2020 в 07:42

1 ответ

Лучший ответ

Вы можете использовать соединение вместо использования concat

x1.join(x2,how='outer').join(x3,how='outer')

Результат:

    I2                            I3                            I1                         
  col3 col1 col4 col5 col9 col8 col3 col1 col4 col5 col9 col8 col3 col1 col4 col5 col9 col8
0    7   54   42  128    8   79    7   54   42  128    8   79    7   54   42  128    8   79
1    1   56   56  102    1   77    1   56   56  102    1   77    1   56   56  102    1   77
2    9   34   52  108    4   68    9   34   52  108    4   68    9   34   52  108    4   68
3    3   42   51  108    8   75    3   42   51  108    8   75    3   42   51  108    8   75
4    3   34   70  100    5   78    3   34   70  100    5   78    3   34   70  100    5   78
0
infiniteloop 18 Апр 2020 в 04:59