【问题标题】:Create an array in a column from rows with duplicate data [duplicate]从具有重复数据的行中创建列中的数组[重复]
【发布时间】:2020-11-29 16:52:16
【问题描述】:

我有一个非常大的数据集(大约 600,000 行)。我想在前4列相同的情况下,通过在最后一列创建数组来减少数据行数。

      make  year      model          engine            part
alfa romeo  1960  giulietta         1.3l l4             A
alfa romeo  1958  giulietta         1.3l l4             B
alfa romeo  1958  giulietta         1.3l l4             A
alfa romeo  1957  giulietta         1.3l l4             B
alfa romeo  1957  giulietta         1.3l l4             A
alfa romeo  1956  giulietta         1.3l l4             B
alfa romeo  1956  giulietta         1.3l l4             A
alfa romeo  1954  giulietta         1.3l l4             B
alfa romeo  1954  giulietta         1.3l l4             A
alfa romeo  1955  giulietta         1.3l l4             B
alfa romeo  1955  giulietta         1.3l l4             A

期望的输出:

      make  year      model          engine            part
alfa romeo  1960  giulietta         1.3l l4            [A]
alfa romeo  1958  giulietta         1.3l l4            [A,B]
alfa romeo  1957  giulietta         1.3l l4            [A,B]
alfa romeo  1956  giulietta         1.3l l4            [A,B]
alfa romeo  1955  giulietta         1.3l l4            [A,B]
alfa romeo  1954  giulietta         1.3l l4            [A,B]

我想我可以使用dataframe.groupby 来获得我想要的输出,但我无法通过多次尝试。我不断收到以下输出的形式<pandas.core.groupby.generic.DataFrameGroupBy object at xxx>

任何帮助将不胜感激!

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    将它们组合在一起并列出它们的内容。

    df.groupby(['make', 'year', 'model', 'engine']).agg(list).reset_index()
    
    
    make    year    model   engine  part
    0   alfa romeo  1954    giulietta   1.3l l4 [B, A]
    1   alfa romeo  1955    giulietta   1.3l l4 [B, A]
    2   alfa romeo  1956    giulietta   1.3l l4 [B, A]
    3   alfa romeo  1957    giulietta   1.3l l4 [B, A]
    4   alfa romeo  1958    giulietta   1.3l l4 [B, A]
    5   alfa romeo  1960    giulietta   1.3l l4 [A]
    

    【讨论】:

    • 谢谢!这实际上也可以完成这项工作,但我确实需要在这里保留一个索引。有没有办法做到这一点?
    • 在末尾包含.reset_index()
    • 啊,完美,在询问之前应该尝试过。谢谢!
    【解决方案2】:

    您可以分组,然后列出部分。

    df = df.groupby(['make', 'year', 'model', 'engine'])['part'].apply(','.join).reset_index()
    

    样本输出:

             make  year      model   engine part
    0  alfa romeo  1957  giulietta  1.3l l4  B,A
    1  alfa romeo  1958  giulietta  1.3l l4  B,A
    2  alfa romeo  1960  giulietta  1.3l l4    A
    

    【讨论】:

    • 我喜欢这个主意,但我收到以下错误AttributeError: 'function' object has no attribute 'transform'
    • @Stephen 试试我的编辑
    • 是的,这很好用,还可以删除重复的行。唯一的变化是将'engine' 添加到groupby。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-07-02
    • 2019-04-08
    • 2012-06-29
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    相关资源
    最近更新 更多