【问题标题】:pivot one column in pandas dataframe and create 4 new columns在 pandas 数据框中旋转一列并创建 4 个新列
【发布时间】:2020-10-27 11:04:32
【问题描述】:

我正在使用熊猫数据框。我有像这样的数据帧:

    df
    COUNTRY   LINE    PRODUCT    SERVICE
    Argelia    1       1.0        Mobile
    Argelia    1       2.0        Mobile
    Argelia    1       3.0        Mobile
    Argelia    2       1.0        Mobile
    Argelia    3       2.0        Mobile
    Argelia    3       3.0        Mobile

我想按 LINE 分组并透视 PRODUCT 列,但我需要 4 个产品列(product_1、product_2、product_3 和 product_4),它不关心是否有任何 PRODUCT 值 = 4。

我正在尝试将get_dummies 与此代码一起使用:

df = pd.concat([df, pd.get_dummies(dfs['PRODUCT'], prefix='product')], axis=1)
df.drop(['PRODUCT'], axis=1, inplace=True)
df = df.groupby(['COUNTRY', 'LINE', 'SERVICE']).agg({'product_1' : np.max, 'product_2': np.max, 'product_3':np.max, 'product_4':np.max}).reset_index()

但它只给了我 3 列产品,我希望 4 列有这个数据框:

 COUNTRY    LINE   SERVICE   product_1  product_2  product_3  product_4
 Argelia     1     Mobile       1          1          1           0
 Argelia     2     Mobile       1          0          0           0
 Argelia     3     Mobile       0          1          1           0

有可能吗?

(我也需要将 PRODUCT 值类型 1.0 更改为 1)

【问题讨论】:

    标签: python pandas dataframe pivot-table


    【解决方案1】:

    DataFrame.reindex 用于所有可能产品的新列,这是替代解决方案,我希望更快地使用DataFrame.pivot_tableDataFrame.clip 获得最大1 值,rename 用于将浮点列转换为整数,@987654324 @和reindex

    cols = [f'product_{i}' for i in range(1, 5)]
    df1 = (df.pivot_table(index=['COUNTRY', 'LINE', 'SERVICE'],
                          columns='PRODUCT',
                          fill_value=0,
                          aggfunc='size')
            .clip(upper=1)
            .rename(columns=int)
            .add_prefix('product_')
            .reindex(cols, axis=1, fill_value=0))
    print (df1)
    PRODUCT               product_1  product_2  product_3  product_4
    COUNTRY LINE SERVICE                                            
    Argelia 1    Mobile           1          1          1          0
            2    Mobile           1          0          0          0
            3    Mobile           0          1          1          0
    

    在您的解决方案中,使用DataFrame.pop 提取列,转换为整数,然后按max 聚合并添加reindex

    df = pd.concat([df, pd.get_dummies(df.pop('PRODUCT').astype(int),prefix='product')], axis=1)
    cols = [f'product_{i}' for i in range(1, 5)]
    df = df.groupby(['COUNTRY', 'LINE', 'SERVICE']).max().reindex(cols, axis=1, fill_value=0)
    print (df)
                          product_1  product_2  product_3  product_4
    COUNTRY LINE SERVICE                                            
    Argelia 1    Mobile           1          1          1          0
            2    Mobile           1          0          0          0
            3    Mobile           0          1          1          0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多