【问题标题】:Faster way to append ordered frequencies of pandas series附加熊猫系列的有序频率的更快方法
【发布时间】:2018-10-29 22:49:29
【问题描述】:

我正在尝试列出熊猫系列中每个组中的元素数量。在我的数据框中,我有一个名为 ID 的列,所有值都出现多次。我想制作一个列表,其中包含每个元素出现的频率。

所以列ID的一个例子是[1,2,3,3,3,2,1,5,2,3,1,2,4,3]

这应该会产生[3,4,5,1,1],因为组 ID 1 出现了 3 次,组 ID 2 出现了 4 次等等。我编写了一个完美的代码:

group_list = df.ID.unique().tolist()
group_size = []

for i in group_list:
    group_size.append(df.ID.value_counts()[i])

问题是它需要很长时间才能完成。我有 500 万行,我让它运行了 50 分钟,但它仍然没有完成!我尝试在前 30-50 行运行它,它按预期工作。

对我来说,简单地使用value_counts(sort=False) 是合乎逻辑的,但它并没有按照它们在我的系列中出现的顺序为我提供组 ID 频率。我也尝试实现扩展,因为我读到它应该更快,但我得到了"numpy.int64 object is not iterable"

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    给定一个系列

    ser = pd.Series([1,2,3,3,3,2,1,5,2,3,1,2,4,3])
    

    您可以执行以下操作:

    ser.value_counts().reindex(ser.unique()).tolist()
    Out: [3, 4, 5, 1, 1]
    

    Reindex 将根据 value_counts 项的出现顺序对其进行重新排序。

    【讨论】:

    • 这是一个非常有效的解决方案,不到一秒钟!我以前没有使用或听说过 reindex 功能,但它似乎非常有用。感谢您的帮助。
    • 不客气。通常,在使用 pandas 时应避免循环,但代码中的真正问题是您在循环的每次迭代中一次又一次地调用 df.ID.value_counts()。如果您将其保存到变量中,那也可以为您节省一些时间。
    • 啊当然!那是一个愚蠢的错误。我试图通过使用 value_counts 来避免循环,但我不知道如何更正输出的顺序。
    猜你喜欢
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 2020-02-18
    • 2020-08-01
    相关资源
    最近更新 更多