首页 > 解决方案 > 将带有二进制列的 pandas 数据帧转换为更紧凑的表示

问题描述

我有以下熊猫数据框:

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'and 'False'。我想将列转换为某事。像这样:

解决方案:

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

可选的:

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

我怎样才能做到这一点?

标签: pythonsqlpandasdataframegroup-by

解决方案


使用DataFrame.set_indexwithDataFrame.unstack来重塑数据框,最后使用mapwithjoin来展平列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

推荐阅读