【问题标题】:Convert multiple year columns into single year column (tidy format) in python pandas [duplicate]在python pandas中将多年列转换为单年列(整洁格式)[重复]
【发布时间】:2020-02-17 03:36:12
【问题描述】:

我的数据集是:

我想把它转换成:

如何在 Python 中使用 pandas 做到这一点?

它已解决,感谢您抽出宝贵时间提供帮助!!!为所有人 +1

【问题讨论】:

    标签: python python-3.x pandas pandas-groupby


    【解决方案1】:

    试试这个:

    pd.melt(df, id_vars=['name'], value_vars=['2016', '2017', '2018',"2019"],var_name='year', value_name='value').sort_values('name')
    
    

    输出:

    
    +----+-------+-------+-------+
    |    | name  | year  | value |
    +----+-------+-------+-------+
    | 0  | abc   | 2016  |     1 |
    | 2  | abc   | 2017  |     2 |
    | 4  | abc   | 2018  |     5 |
    | 6  | abc   | 2019  |     9 |
    | 1  | def   | 2016  |     5 |
    | 3  | def   | 2017  |     8 |
    | 5  | def   | 2018  |     8 |
    | 7  | def   | 2019  |     4 |
    +----+-------+-------+-------+
    
    

    【讨论】:

      【解决方案2】:

      你可以使用

      a = df.columns[1:]
      df.melt(id_vars='name',value_vars = a,var_name='year').sort_values('name')
      

      【讨论】:

        【解决方案3】:

        你可以使用pandas.melt而不指定value_vars

        如果未指定,则使用所有未设置为 id_vars 的列。

        df.melt(id_vars='name', var_name='year').sort_values('name')
        
          name  year  value
        0  abc  2016      1
        2  abc  2017      2
        4  abc  2018      5
        6  abc  2019      9
        1  def  2016      5
        3  def  2017      8
        5  def  2018      8
        7  def  2019      4
        

        【讨论】:

          【解决方案4】:
          • pandas.melt 是将数据框转换为 tidy format 的最简单方法。
            • 将 DataFrame 从宽格式转为长格式,可选择保留标识符变量集。
          • 另一种方法是pandas.wide_to_long
            • 从宽面板到长格式。与 melt 相比,灵活性较差,但更易于使用。
          import pandas as pd
          
          # create dataframe
          df = pd.DataFrame({'name': ['abc', 'def'],
                             '2016': [1, 5],
                             '2017': [2, 8],
                             '2018': [5, 8],
                             '2019': [9, 4]})
          
          name  2016  2017  2018  2019
           abc     1     2     5     9
           def     5     8     8     4
          
          # melt df
          df_melt = df.melt(id_vars='name', value_vars=['2016', '2017', '2018', '2019'])
          
          name variable  value
           abc     2016      1
           def     2016      5
           abc     2017      2
           def     2017      8
           abc     2018      5
           def     2018      8
           abc     2019      9
           def     2019      4
          

          【讨论】:

            猜你喜欢
            • 2020-02-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-11-03
            • 2017-04-06
            • 2022-01-13
            相关资源
            最近更新 更多