gpt4 book ai didi

python - 哪个 Pandas 数据框更好 : super long dataframe VS badly structured one with lists

转载 作者:行者123 更新时间:2023-12-02 23:28:31 24 4
gpt4 key购买 nike

我一直在尝试通过使用 n-gram 对文本进行标记来进行 NLP。我必须按标签 A 计算每个 n-gram 出现的次数。和B分别。

但是,我必须在将长列表放入列与获取非常长的数据帧之间进行选择,并且我不确定哪种结构优于另一种结构。

据我所知,在数据帧的列中包含列表是一个糟糕的结构,因为您几乎无法使用 pandas 操作获得任何有用的信息,例如获取多个列表中某个项目的频率(出现)。此外,即使可能,也需要更多的计算来完成任何任务。

但是,我知道数据帧太长会消耗大量 RAM,如果数据太大而无法放入 RAM,甚至可能会杀死其他进程。我当然不想陷入这种情况。

所以现在我必须做出选择。我想要做的是通过标签计算每个 ngram 项目的出现次数。

例如,(数据框如下所示)

{

{ngram: hey, occurence_A: 2, occurence_B: 0},

{ngram: python, occurence_A: 2, occurence_B: 1},

...

}

我认为这与说明我的计算机规范有关。

CPU: i3-6100

RAM: 16GB

GPU: n/a

数据框1:

+------------+-------------------------------------------+-------+
| DATE | NGRAM | LABEL |
+------------+-------------------------------------------+-------+
| 2019-02-01 | [hey, hey, reddit, reddit, learn, python] | A |
| 2019-02-02 | [python, reddit, pandas, dataframe] | B |
| 2019-02-03 | [python, reddit, ask, learn] | A |
+------------+-------------------------------------------+-------+

数据框2:

+------------+-----------+-------+
| DATE | NGRAM | LABEL |
+------------+-----------+-------+
| 2019-02-01 | hey | A |
| 2019-02-01 | hey | A |
| 2019-02-01 | reddit | A |
| 2019-02-01 | reddit | A |
| 2019-02-01 | learn | A |
| 2019-02-01 | python | A |
| 2019-02-02 | python | B |
| 2019-02-02 | reddit | B |
| 2019-02-02 | pandas | B |
| 2019-02-02 | dataframe | B |
| 2019-02-03 | python | A |
| 2019-02-03 | reddit | A |
| 2019-02-03 | ask | A |
| 2019-02-03 | learn | A |
+------------+-----------+-------+

最佳答案

就像您提到的,在数据​​帧的列中包含列表是一种糟糕的结构,并且首选长格式数据帧。我尝试从几个方面来回答这个问题:

  1. 增加了数据操作的复杂性,并且缺乏对类似列表的列的 native 支持功能

对于类似列表的列,您无法轻松使用 Pandas 函数。

例如,您提到您对 LABELNGRAM 感兴趣。使用 dataframe1 (df1),您可以通过简单的 groupby 和 count 函数轻松获得所需的内容,而对于 dataframe2 (df2),您需要分解列表列表列,然后才能对其进行处理:

df1.groupby(['LABEL','NGRAM']).count().unstack(-1).fillna(0)

df2.explode(column='NGRAM').groupby(['LABEL','NGRAM']).count().unstack(-1).fillna(0)

两者都给你同样的东西:

enter image description here

此外,许多原生 Pandas 函数(例如我最喜欢的 value_counts)无法直接在列表上工作,因此几乎总是需要 explode

  • 长数据的计算时间比列表类数据的计算时间短(一般来说,因为我们不需要先分解列)
  • 假设您决定将 NGRAM 大写,您将分别执行以下操作,您可以看到 df2 需要更长的时间来执行:

    df1['NGRAM'] = df1['NGRAM'].str.capitalize()
    # 1000 loops, best of 5: 1.49 ms per loop

    df2['NGRAM'] = df2['NGRAM'].explode().str.capitalize().groupby(level=0).apply(list)
    # 1000 loops, best of 5: 246 µs per loop

    如果内存对您来说是一个问题,您可能需要考虑直接使用每个标签的 NGRAM 计数(上图中的数据结构,而不是将它们存储为 df1 或 df2)或使用 Numpy 数组(这可以减少开销) Pandas 稍微),同时单独保存 NGRAM 字典文件。

    关于python - 哪个 Pandas 数据框更好 : super long dataframe VS badly structured one with lists,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60389468/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com