【问题标题】:Iterate through two dataframes and create a dictionary one data frame that is a substring in strings found in the second dataframe (values)遍历两个数据帧并创建一个字典,一个数据帧是在第二个数据帧(值)中找到的字符串中的子字符串
【发布时间】:2020-06-16 17:26:31
【问题描述】:

我有两个数据框。一个非常大,有超过 400 万行数据,而另一个有大约 26k。我正在尝试创建一个字典,其中键是较小数据框的字符串。此数据框 (df1) 包含子字符串或不完整的名称,而较大的数据框 (df2) 包含全名/字符串,我想检查 df1 中的子字符串是否在 df2 中的字符串中,然后创建我的字典。

无论我尝试什么,我的代码都需要很长时间,我一直在寻找更快的方法来迭代 df。

org_dict={}
for rowi in df1.itertuples():
    part = rowi.part_name
    full_list = []
    for rowj in df2.itertuples():
        if part in rowj.full_name:
            full_list.append(full_name)
            org_dict[part]=full_list

我错过了休息时间还是有更快的方法来遍历超过 100 万行的非常大的数据帧?

样本数据:

df1

    part_name
0   aaa
1   bb
2   856
3   cool
4   man
5   a0

df2

    full_name
0   aaa35688d
1   coolbbd
2   8564578
3   coolaaa
4   man4857684
5   a03567

预期输出:

{'aaa':['aaa35688d','coolaaa'],
'bb':['coolbbd'],
'856':['8564578']
...}

【问题讨论】:

  • 请分享几行数据框和预期输出。

标签: python pandas dataframe


【解决方案1】:

这里的问题是,随着数据的增长,嵌套的 for 循环在时间上的表现非常糟糕。幸运的是,pandas 允许我们跨行/列执行矢量化操作。

如果无法访问您的数据样本,我无法正确测试,但我相信这样做可以解决问题并且执行得更快:

org_dict = {substr: df2.full_name[df2.full_name.str.contains(substr)].tolist() for substr in df1.part_name}

【讨论】:

  • 添加样本数据
  • 谢谢,这似乎还需要很长时间。还没有完成执行。不知道有什么我能做的。我确实看到了一个比较 for 循环、iterrows、apply() 和矢量化操作的页面,矢量化操作似乎是最快的......
  • 是的,我认为当时没有任何(明显的)方法可以提高速度。你必须想出一种方法来矢量化你的比较,这种方法比 pandas/numpy 开发人员目前使我们能够做的更快/更好,我认为这不是一项微不足道的任务。
  • 您总是可以创建一个新问题,例如“最快的方式...”,这更符合您的实际需求。可能值得一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
相关资源
最近更新 更多