【问题标题】:python:pandas - How to combine first two rows of pandas dataframe to dataframe header?python:pandas - 如何将前两行 pandas 数据帧组合到数据帧头?
【发布时间】:2018-03-03 14:00:18
【问题描述】:

我正在尝试读取一个如下所示的 excel 文件:

我还有一个脚本可以将此 xlsx 文件转换为带有工作表名称的 csv 文件(如果三个工作表可用,那么它将创建三个不同的 csv 文件)。

它的 csv 文件如下所示:

Unnamed: 0,Gender A,Unnamed: 2,Gender B,Unnamed: 4,Gender C,Gender D
date,Male,Female,Male,Female,Male,Female
2017-01-01 00:00:00,2,3,3,2,3,3
2017-01-02 00:00:00,5,7,7,42,3,5
2017-01-03 00:00:00,4,6,6,12,2,7
2017-01-04 00:00:00,6,7,3,6,4,8
2017-01-05 00:00:00,6,8,8,3,5,3
2017-01-06 00:00:00,54,3,3,6,3,5
2017-01-07 00:00:00,3,4,6,3,6,5
2017-01-08 00:00:00,3,6,6,3,6,4
2017-01-09 00:00:00,2,2,8,7,5,2
2017-01-10 00:00:00,4,3,2,4,5,5
2017-01-11 00:00:00,12,10,10,3,1,6
2017-01-12 00:00:00,9,7,7,3,4,1

那么,我的第一个问题是处理这些文件的最佳选择是 xlsx 还是 csv?

接下来,我只想读取前两行作为列标题。这样我就可以了解在哪个性别中有多少男性和女性可用。

预期输出:

0                  date   Gender A_Male Gender A_Female   Gender B_Male  Gender B_Female   Gender C_Male  Gender D_Female 
1   2017-01-01 00:00:00        2              3           3                 2               3                  3
2   2017-01-02 00:00:00        5              7           7                42               3                  5
3   2017-01-03 00:00:00        4              6           6                12               2                  7
4   2017-01-04 00:00:00        6              7           3                 6               4                  8
5   2017-01-05 00:00:00        6              8           8                 3               5                  3
6   2017-01-06 00:00:00       54              3           3                 6               3                  5
7   2017-01-07 00:00:00        3              4           6                 3               6                  5
8   2017-01-08 00:00:00        3              6           6                 3               6                  4
9   2017-01-09 00:00:00        2              2           8                 7               5                  2
10  2017-01-10 00:00:00        4              3           2                 4               5                  5
11  2017-01-11 00:00:00       12             10          10                 3               1                  6
12  2017-01-12 00:00:00        9              7           7                 3               4                  1

【问题讨论】:

    标签: python excel pandas csv


    【解决方案1】:

    让我们试试吧:

    df = pd.read_excel('Untitled 2.xlsx', header=[0,1])
    df.columns = df.columns.map('_'.join)
    df.rename_axis('Date').reset_index()
    

    输出:

             Date  Gender A_Male  Gender A_Female  Gender B_Male  Gender B_Female  \
    0  2017-01-01              2                3              3                2   
    1  2017-01-02              5                7              7               42   
    2  2017-01-03              4                6              6               12   
    3  2017-01-04              6                7              3                6   
    4  2017-01-05              6                8              8                3   
    5  2017-01-06             54                3              3                6   
    6  2017-01-07              3                4              6                3   
    7  2017-01-08              3                6              6                3   
    8  2017-01-09              2                2              8                7   
    9  2017-01-10              4                3              2                4   
    10 2017-01-11             12               10             10                3   
    11 2017-01-12              9                7              7                3   
    
        Gender C_Male  Gender D_Female  
    0               3                3  
    1               3                5  
    2               2                7  
    3               4                8  
    4               5                3  
    5               3                5  
    6               6                5  
    7               6                4  
    8               5                2  
    9               5                5  
    10              1                6  
    11              4                1  
    

    【讨论】:

      【解决方案2】:

      我喜欢@ScottBoston 的方法。这里有一些化妆品替代品。 如果您希望列标题看起来漂亮,尤其是当第二行包含数量单位时,您可以执行以下操作:

      df = pd.read_excel('Untitled 2.xlsx', header=[0,1], index_col=0)
      df.columns = df.columns.map(lambda h: '{}\n({})'.format(h[0], h[1]))
      df.rename_axis('Date')
      

      如果您想确保列名不包含空格(因此您可以将它们作为 DataFrame 的属性进行访问):

      df = pd.read_excel('Untitled 2.xlsx', header=[0,1], index_col=0)
      df.columns = df.columns.map(lambda h: '  '.join(h).replace(' ', '_'))
      df.rename_axis('Date')
      

      这给出了:

                           Gender_A__Male  Gender_A__Female   ...         Gender_C__Male  Gender_D__Female
      Date                                                    ...                                         
      2017-01-01 00:00:00               2                 3   ...                      3                 3
      2017-01-02 00:00:00               5                 7   ...                      3                 5
      2017-01-03 00:00:00               4                 6   ...                      2                 7
      2017-01-04 00:00:00               6                 7   ...                      4                 8
      2017-01-05 00:00:00               6                 8   ...                      5                 3
      2017-01-06 00:00:00              54                 3   ...                      3                 5
      2017-01-07 00:00:00               3                 4   ...                      6                 5
      2017-01-08 00:00:00               3                 6   ...                      6                 4
      2017-01-09 00:00:00               2                 2   ...                      5                 2
      2017-01-10 00:00:00               4                 3   ...                      5                 5
      2017-01-11 00:00:00              12                10   ...                      1                 6
      2017-01-12 00:00:00               9                 7   ...                      4                 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-06
        • 1970-01-01
        • 2018-03-17
        • 2021-10-18
        • 1970-01-01
        • 2023-04-10
        • 2023-03-20
        相关资源
        最近更新 更多