【问题标题】:How to Reshape dataframe in Pandas?如何在 Pandas 中重塑数据框?
【发布时间】:2025-11-15 20:55:02
【问题描述】:

我正在对数据集进行一些机器学习。我对 python 中的 pandas/numpy 很陌生。所以我无法找出解决方案。我有一个使用 pandas 的 read_csv 函数获得的数据框。数据框类似如下所示

ID   ATTR  QUANTITY
17   203      14
17   201      8
17   111      1
159  80       5
178  82       16

我希望这个数据框被重塑/展平:

    ID  | attr1 | attr2 | attr3 | totalQuantity..................goes on
===========================================================
    17  |  203  |  201  |  111  |   23 (i.e sum where id == 17)
    159 |  80   |   0   |   0   |   5
    178 |  82   |   0   |   0   |   16
    ....

高度赞赏的一段代码。提前致谢

【问题讨论】:

    标签: python numpy pandas machine-learning attributes


    【解决方案1】:

    首先创建列att 以通过cumcount 进行透视然后使用pivotdf1groupbysumdf2。最后merge df1df2fillna 0

    print df
         ID  ATTR  QUANTITY
    0    17   203        14
    1    17   201         8
    2    17   111         1
    3    17   203        14
    4    17   201         8
    5    17   111         1
    6    17   203        14
    7    17   201         8
    8    17   111         1
    9    17   203        14
    10   17   201         8
    11   17   111         1
    12  159    80         5
    13  178    82        16
    
    #add column att for counting groups items
    df['att'] = df.groupby('ID')['ID'].cumcount() + 1
    #pivot df with column att
    df1 = df.pivot(index='ID', columns='att', values='ATTR').reset_index()
    #add string 'attr' to columns names
    df1.columns =  [df1.columns[0]] + ['attr' + str(col) for col in df1.columns[1:]] 
    df2 = df.groupby('ID')['QUANTITY'].sum().reset_index()
    #merge with sum
    print pd.merge(df1, df2 , on=['ID']).fillna(0)
    
        ID  attr1  attr2  attr3  attr4  attr5  attr6  attr7  attr8  attr9  attr10  \
    0   17    203    201    111    203    201    111    203    201    111     203   
    1  159     80      0      0      0      0      0      0      0      0       0   
    2  178     82      0      0      0      0      0      0      0      0       0   
    
       attr11  attr12  QUANTITY  
    0     201     111        92  
    1       0       0         5  
    2       0       0        16  
    

    【讨论】:

    • 非常感谢您的回答。似乎部分工作。它创建列并用值填充它们,但我不知道为什么列的创建顺序有点奇怪。
    • 后面的顺序是Index([u'id', u'attr1', u'attr10', u'attr11', u'attr12', u'attr13', u'attr14', u'attr15', u'attr16', u'attr17', u'attr18', u'attr19', u'attr2', u'attr20', u'attr3', u'attr4', u'attr5', u'attr6', u'attr7', u'attr8', u'attr9'], dtype='object')
    • 我在数据集中有大约 50k 行,该函数大约需要 1 分钟才能执行。顺便说一句,我应该检查什么?我看到代码和之前一样
    • 解决方案已编辑,现在更快。请检查一下。
    • 非常感谢。奇迹般有效。只需 3 -4 秒 :) 你太棒了