【问题标题】:creating a data frame after group by clause在 group by 子句之后创建数据框
【发布时间】:2015-10-02 02:55:21
【问题描述】:

我正在尝试对数据集进行重复数据删除并将重复数据删除数据集转换为另一个数据框。然而,重复数据集的第一列是按变量分组

import pandas as pd
df = pd.DataFrame({ 'Cust':list('AAABBB'),'Dt':list('XXYYZZ'),'PA1':list('HHHMMH'),
                    'PA2': list('MLMMMM'),'PA3':[1,2,3,3,3,1] })

df2 = df.groupby('[Cust','Dt'], as_index=False).sum()

for col in ['PA1','PA2','PA3']:
    df2[col] = df.groupby(['Cust','Dt'],as_index=False)[col].apply( lambda x: 
                                              '&'.join( x.astype(str).unique() ))

这给了我错误 raise TypeError('插入列的索引不兼容'

TypeError: 插入列的索引与框架索引不兼容

我希望将输出复制到另一个数据框 (df3) 以显示为 (保留原始日期的列顺序 - df) 原因是重复数据元素需要加载到数据库中,并且原始(和数据库模式)和重复数据集的布局(列顺序)应该相同。

Cust Dt     PA1    PA2  PA3
A    X    1&2&3    H    M&L
B    Y    3&1     M&H    M

谢谢 PMV

【问题讨论】:

    标签: pandas preserve


    【解决方案1】:

    最简单的方法是使用as_index=False,然后重新索引:

    df3 = df.groupby('Cust', as_index=False).sum()
    for col in ['PA1','PA2','PA3']:
        df3[col] = df.groupby('Cust', as_index=False)[col].apply( lambda x:
                                                      '&'.join( x.astype(str).unique() ))
    
    In [11]: df3
    Out[11]:
      Cust    PA3  PA1  PA2
    0    A  1&2&3    H  M&L
    1    B    3&1  M&H    M
        
    In [12]: df3.reindex_axis(df.columns, axis=1)
    Out[12]:
      Cust  PA1  PA2    PA3
    0    A    H  M&L  1&2&3
    1    B  M&H    M    3&1
    

    如果你有以 Cust 作为索引的 DataFrame,你可以 reset_index 代替:

    In [21]: df2.reset_index().reindex_axis(df.columns, axis=1)
    Out[21]:
      Cust  PA1  PA2    PA3
    0    A    H  M&L  1&2&3
    1    B  M&H    M    3&1
    

    【讨论】:

    • 此解决方案不适用于 pandas .12.. 它抱怨索引不兼容.. .12 中有解决方法
    • @pmv 在哪个阶段?我强烈建议你升级你的 pandas,但这里可能有一个解决方法。
    • @Andy——我复制了上面的实际示例。我有多个按列分组。上面的例子有 2 个按列分组
    猜你喜欢
    • 2012-04-20
    • 1970-01-01
    • 2021-08-26
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 2019-07-29
    相关资源
    最近更新 更多