【问题标题】:Python Pandas: how to only pivot certain columns while keeping others?Python Pandas:如何只旋转某些列而保留其他列?
【发布时间】:2020-08-16 07:26:12
【问题描述】:

another question 的标题非常相似,但那里的答案似乎不适用于我的问题。

我有以下数据框:

                           date  hour  rating category  value
date_time                                                    
2020-02-01 00:00:00  2020-02-01     1    30.0       C1   41.5
2020-02-01 01:00:00  2020-02-01     2    32.4       C1   54.1
2020-02-01 02:00:00  2020-02-01     3    31.1       C1   40.9
2020-02-01 00:00:00  2020-02-01     1     NaN       C2   51.5
2020-02-01 01:00:00  2020-02-01     2     NaN       C2   50.6
2020-02-01 02:00:00  2020-02-01     3     NaN       C2   42.3
2020-02-02 00:00:00  2020-02-02     1    36.8       C1   47.8
2020-02-02 01:00:00  2020-02-02     2    30.1       C1   50.1
2020-02-02 02:00:00  2020-02-02     3    30.5       C1   44.0
2020-02-02 00:00:00  2020-02-02     1     NaN       C2   46.8
2020-02-02 01:00:00  2020-02-02     2     NaN       C2   44.2
2020-02-02 02:00:00  2020-02-02     3     NaN       C2   45.2

我想转换成这个:

                           date  hour  rating  C1    C2   
date_time                                                    
2020-02-01 00:00:00  2020-02-01     1    30.0  41.5  51.5
2020-02-01 01:00:00  2020-02-01     2    32.4  54.1  50.6
2020-02-01 02:00:00  2020-02-01     3    31.1  40.9  42.3
2020-02-02 00:00:00  2020-02-02     1    36.8  47.8  46.8
2020-02-02 01:00:00  2020-02-02     2    30.1  50.1  44.2
2020-02-02 02:00:00  2020-02-02     3    30.5  44.0  45.2

所以基本上将某个categoryvalue 显示在不同的列中,而不是每一行显示其category

根据我上面链接的问题,我想出了这个:

pivoted_df = df.pivot_table(values="value", index=[df.index, "hour", "date", "rating"], columns="category")

但该操作的结果是:

category                                      C1
date_time           hour date       rating      
2020-02-01 00:00:00 1    2020-02-01 30.0    41.5
2020-02-01 01:00:00 2    2020-02-01 32.4    54.1
2020-02-01 02:00:00 3    2020-02-01 31.1    40.9
2020-02-02 00:00:00 1    2020-02-02 36.8    47.8
2020-02-02 01:00:00 2    2020-02-02 30.1    50.1
2020-02-02 02:00:00 3    2020-02-02 30.5    44.0

这真的不是我想要的。不仅如此,我还会添加hourdaterating 作为索引,这看起来不太正确,因为我希望将它们作为“普通”列。

我怎样才能实现我上面提到的?提前谢谢!

【问题讨论】:

    标签: python-3.x pandas dataframe


    【解决方案1】:

    一种方法是在categorygroupby first unstack,合并多级列并重命名它们。

     g=df.groupby(['date_time', 'date', 'hour','category']).first()\
    .unstack('category').reset_index().dropna(axis='columns')
    
    g.columns = [f'{a}{b}' for a, b in g.columns]#Collapse multiindex
    g.rename(columns={'ratingC1':'rating', 'valueC1':'C1','valueC2':'C2'}, inplace=True)#Rename columns
    
            
    
          date_time                      date     hour rating    C1    C2
    0  2020-02-01 00:00:00 00:00:00  2020-02-01     1    30.0  41.5  51.5
    1  2020-02-01 01:00:00 01:00:00  2020-02-01     2    32.4  54.1  50.6
    2  2020-02-01 02:00:00 02:00:00  2020-02-01     3    31.1  40.9  42.3
    3  2020-02-02 00:00:00 00:00:00  2020-02-02     1    36.8  47.8  46.8
    4  2020-02-02 01:00:00 01:00:00  2020-02-02     2    30.1  50.1  44.2
    5  2020-02-02 02:00:00 02:00:00  2020-02-02     3    30.5  44.0  45.2
    

    或者,使用 pd.pivot

     import numpy as np
    g=pd.pivot_table(df,index=["date_time","date","hour"],\
                     values=["value","rating"],columns=["category"]).reset_index()#Pivot
    g.columns = [f'{a}{b}' for a, b in g.columns]#Collapse multiindex
    g.rename(columns={'ratingC1':'rating', 'valueC1':'C1','valueC2':'C2'}, inplace=True)#Rename columns
    print(g)
    

    【讨论】:

    • 非常感谢,您让我摆脱了巨大的头痛。不过需要注意的是,我提到我想保留date_time 作为数据框的索引。因此,我所要做的就是添加 pivoted_df.set_index("date_time", inplace=True) 以使用 date_time 列作为索引。
    猜你喜欢
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2017-01-13
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 2021-05-14
    相关资源
    最近更新 更多