【问题标题】:Transform pandas dataframe with binary columns to a more compact representation将具有二进制列的 pandas 数据帧转换为更紧凑的表示
【发布时间】:2020-10-25 12:18:45
【问题描述】:

我有以下熊猫数据框:

import pandas as pd
import numpy as np

np.random.seed(0)
daytime = pd.date_range('2015-02-24', periods=6, freq='d')
df = pd.DataFrame({'DATE': ['2015-02-24', '2015-02-24', '2015-02-25', '2015-02-25', '2015-02-26', '2015-02-26'],  
                   'HappyCustomer': ['True', 'False','True', 'False','True', 'False'],
                   'HappyCustomerCount': [2, 4,1, 6, 2, 3] }) 

df.set_index('DATE', inplace=True)

df.head(6)


    HappyCustomer   HappyCustomerCount
DATE        
2015-02-24  True    2
2015-02-24  False   4
2015-02-25  True    1
2015-02-25  False   6
2015-02-26  True    2
2015-02-26  False   3

我认为HappyCustomer 列是多余的,因为它始终是'True''False'。我想将列转换为某事。像这样:

解决方案:

        HappyCustomerCount_True  HappyCustomerCount_False
DATE        
2015-02-24      2                 4 
2015-02-25      1                 6
2015-02-26      2                 3

可选:

在最好的情况下,我可以使用groupby 等(与 SQL 相关的)函数进行此转换,因为稍后我必须在 SQL 数据库中执行相同的工作。

我该怎么做?

【问题讨论】:

    标签: python sql pandas dataframe group-by


    【解决方案1】:

    使用DataFrame.set_indexDataFrame.unstack 来重塑数据框,最后使用mapjoin 来展平MultiIndex 列:

    df1 = df.set_index('HappyCustomer', append=True).unstack()
    df1.columns = df1.columns.map('_'.join)
    

    结果:

    # print(df1)
    
                HappyCustomerCount_False  HappyCustomerCount_True
    DATE                                                         
    2015-02-24                         4                        2
    2015-02-25                         6                        1
    2015-02-26                         3                        2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      • 2020-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多