在csv中处理多个列标题和相同的列名-pandas / python

时间:2020-03-25 17:06:16

标签: python pandas csv

我有一个看起来像这样的CSV文件

        PROD1   PROD1   PROD2   PROD2
        X         Y       X       Y
AA  A   1         2       9       10
BB  B   3         4       11      12
CC  C   5         6       13      14
DD  D   7         8       15      16

我试图获得的输出必须看起来像这样

                X   Y
AA  A   PROD1   1   2
BB  B   PROD1   3   4
CC  C   PROD1   5   6
DD  D   PROD1   7   8
AA  A   PROD2   9   10
BB  B   PROD2   11  12
CC  C   PROD2   13  14
DD  D   PROD2   15  16

我尝试将CS​​V读入与

data=pd.read_csv('transposedata.csv', header=None).T

但是随后我丢失了列信息。我还从stackoverflow此处提供的另一种解决方案中尝试了此方法

df = pd.read_csv('transposedata.csv', header=[0,1])
a = df.columns.get_level_values(0).to_series()
b = a.mask(a.str.startswith('Unnamed')).ffill().fillna('')
df.columns = [b, df.columns.get_level_values(1)]

我最终得到

                                           PROD1    PROD2    
  Unnamed: 0_level_1 Unnamed: 1_level_1     X  Y     X   Y
0                 AA                  A     1  2     9  10
1                 BB                  B     3  4    11  12
2                 CC                  C     5  6    13  14
3                 DD                  D     7  8    15  16

有帮助吗?

更新 当我运行给定的解决方案

data=pd.read_csv('transposedata1.csv', header=[0,1]).stack(level=0).sort_index(level=1)

我明白了

        Unnamed:0_level_1   Unnamed:1_level_1   X   Y
0   PROD1   NaN NaN 1   2
1   PROD1   NaN NaN 3   4
2   PROD1   NaN NaN 5   6
3   PROD1   NaN NaN 7   8
0   PROD2   NaN NaN 9   10
1   PROD2   NaN NaN 11  12
2   PROD2   NaN NaN 13  14
3   PROD2   NaN NaN 15  16
0   Unnamed:0_level_0   AA  NaN NaN NaN
1   Unnamed:0_level_0   BB  NaN NaN NaN
2   Unnamed:0_level_0   CC  NaN NaN NaN
3   Unnamed:0_level_0   DD  NaN NaN NaN
0   Unnamed:1_level_0   NaN A   NaN NaN
1   Unnamed:1_level_0   NaN B   NaN NaN
2   Unnamed:1_level_0   NaN C   NaN NaN
3   Unnamed:1_level_0   NaN D   NaN NaN

谢谢

1 个答案:

答案 0 :(得分:4)

您不想转置数据框,而是堆叠一列级别。只需向熊猫声明csv文件具有2行标题即可:

data=pd.read_csv('transposedata.csv', header=[0,1]).stack(level=0).sort_index(level=2)

它应该给出:

             X   Y
AA A PROD1   1   2
BB B PROD1   3   4
CC C PROD1   5   6
DD D PROD1   7   8
AA A PROD2   9  10
BB B PROD2  11  12
CC C PROD2  13  14
DD D PROD2  15  16