【问题标题】:Efficiently split pandas dataframe based on combinations of one column values根据一列值的组合有效拆分熊猫数据框
【发布时间】:2021-05-25 10:50:34
【问题描述】:

假设我有一个包含一列的数据框,它有 3 个唯一值

Click here to see input

import pandas as pd
df = pd.DataFrame(['a', 'b', 'c'], columns = ['string'])
df

我想将此数据帧拆分为更小的数据帧,这样每个数据帧将包含 2 个唯一值。在上述情况下,我需要 3 个数据帧 3c2(nCr) = 3。df1 - [a b] df2 - [a c] df3 - [b c]。请点击下面的链接查看我当前的实现。

Click here to see current code and output

import itertools
for i in itertools.combinations(df.string.values, 2):
    print(df[df.string.isin(i)], '\n')

我在熊猫中看起来像 groupby。因为循环内的子设置数据非常耗时。在一个示例案例中,我有 609 个唯一值,完成循环大约需要 3 分钟。因此,寻找一些优化的方法来执行相同的操作,因为在实际场景中唯一值可能会高达 1000 个。

【问题讨论】:

  • 欢迎来到 StackOverflow。我们中的许多人都不允许去 imgr 和其他网站。你能在这里发布屏幕截图吗?或者更好的是,发布实际的代码和输出?这样,我们就不必重新输入您的代码来测试我们的解决方案(而且您更有可能得到答案)。
  • @rajah9 对不起!现在,我添加了有问题的代码块。我没有足够的声誉来添加图片。

标签: python pandas dataframe pandas-groupby combinations


【解决方案1】:

这会很慢,因为您要创建 370k 数据帧。如果它们都应该只包含两个值,为什么它需要是一个数据框?

df = pd.DataFrame({'x': range(100)})
df['key'] = 1
records = df.merge(df, on='key').drop('key', axis=1).to_dict('r')
[pd.Series(x) for x in records]

您会看到records 的计算速度非常快,但生成所有这些系列对象需要几分钟。

【讨论】:

  • 嗨@rudolfovic - 感谢您的回复。它将有 2 个唯一值,而不是 2 个值。这就是我选择数据框的原因。为简单起见,我将其称为 1 列,实际上数据会有许多其他列。
猜你喜欢
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
相关资源
最近更新 更多