gpt4 book ai didi

python - pandas DataFrame 中行的有效成对比较

转载 作者:行者123 更新时间:2023-12-01 13:18:49 24 4
gpt4 key购买 nike

我目前正在处理一个较小的数据集(大约 900 万行)。不幸的是,大多数条目都是字符串,即使强制转换为类别,框架在内存中也只有几 GB。

我想做的是将每一行与其他行进行比较,并对内容进行直接比较。例如,给定

   A   B     C      D
0 cat blue old Saturday
1 dog red old Saturday

我想计算
      d_A   d_B   d_C   d_D
0, 0 True True True True
0, 1 False False True True
1, 0 False False True True
1, 1 True True True True

显然,组合爆炸将排除将每条记录与每条其他记录进行比较。所以我们可以改为使用阻塞,通过应用 groupby,比如在 A 列上。

我的问题是,有没有一种方法可以在 Pandas 或 dask 中做到这一点,它比以下序列更快:
  • 按索引分组
  • 外部将每个组加入到自身以产生对
  • dataframe.apply 对每行的比较函数

  • 作为引用,假设我可以访问大量内核(数百个)和大约 200G 的内存。

    最佳答案

    解决方案原来是使用 numpy 代替步骤 3)。虽然我们不能为每一行创建一个外连接,但我们可以按 A 列中的值分组并创建更小的组来进行外连接。

    诀窍是使用 numpy.equal.outer(df1, df2).ravel()当数据帧以这种方式作为输入传递给 numpy 函数时,结果是一个更快(至少 30 倍)的矢量化结果。例如:

    >>> df = pd.DataFrame
    A B C D
    0 cat blue old Saturday
    1 dog red old Saturday

    >>> result = pd.DataFrame(columns=["A", "B", "C", "D"],
    index=pd.MultiIndex.from_product([df.index, df.index]))
    >>> result["A"] = np.equal.outer(df["A"], df["A"]).ravel()
    >>> result
    A B C D
    0, 0 True NaN NaN NaN
    0, 1 False NaN NaN NaN
    1, 0 False NaN NaN NaN
    1, 1 True NaN NaN NaN

    您可以对每一列重复,或者只是在结果上按列应用自动执行该过程。

    关于python - pandas DataFrame 中行的有效成对比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51831161/

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