【问题标题】:Comparing pandas map and merge比较熊猫地图和合并
【发布时间】:2022-01-12 13:45:03
【问题描述】:

我有以下df:

df = pd.DataFrame({'key': {0: 'EFG_DS_321',
    1: 'EFG_DS_900',
      2: 'EFG_DS_900',
      3: 'EFG_Q_900',
      4: 'EFG_DS_1000',
      5: 'EFG_DS_1000',
      6: 'EFG_DS_1000',
      7: 'ABC_DS_444',
      8: 'EFG_DS_900',
      9: 'EFG_DS_900',
      10: 'EFG_DS_321',
      11: 'EFG_DS_900',
      12: 'EFG_DS_1000',
      13: 'EFG_DS_900',
      14: 'EFG_DS_321',
      15: 'EFG_DS_321',
      16: 'EFG_DS_1000',
      17: 'EFG_DS_1000',
      18: 'EFG_DS_1000',
      19: 'EFG_DS_1000',
      20: 'ABC_DS_444',
      21: 'EFG_DS_900',
      22: 'EFG_DAS_12345',
      23: 'EFG_DAS_12345',
      24: 'EFG_DAS_321',
      25: 'EFG_DS_321',
      26: 'EFG_DS_12345',
      27: 'EFG_Q_1000',
      28: 'EFG_DS_900',
      29: 'EFG_DS_321'}})

我有以下字典:

d = {'ABC_AS_1000': 123,
  'ABC_AS_444': 321,
  'ABC_AS_231341': 421,
  'ABC_AS_888': 412,
  'ABC_AS_087': 4215,
  'ABC_DAS_1000': 3415,
  'ABC_DAS_444': 4215,
  'ABC_DAS_231341': 3214,
  'ABC_DAS_888': 321,
  'ABC_DAS_087': 111,
  'ABC_Q_1000': 222,
  'ABC_Q_444': 3214,
  'ABC_Q_231341': 421,
  'ABC_Q_888': 321,
  'ABC_Q_087': 41,
  'ABC_DS_1000': 421,
  'ABC_DS_444': 421,
  'ABC_DS_231341': 321,
  'ABC_DS_888': 41,
  'ABC_DS_087': 41,
  'EFG_AS_1000': 213,
  'EFG_AS_900': 32,
  'EFG_AS_12345': 1,
  'EFG_AS_321': 3,
  'EFG_DAS_1000': 421,
  'EFG_DAS_900': 321,
  'EFG_DAS_12345': 123,
  'EFG_DAS_321': 31,
  'EFG_Q_1000': 41,
  'EFG_Q_900': 51,
  'EFG_Q_12345': 321,
  'EFG_Q_321': 321,
  'EFG_DS_1000': 41,
  'EFG_DS_900': 51,
  'EFG_DS_12345': 321,
  'EFG_DS_321': 1}

我想将 d 映射到 df,但鉴于实际数据非常庞大且复杂,我试图了解 map 或 merge 在效率(运行时间)方面是否更好。 第一个选项: 一张简单的地图

res = df['key'].map(d)

第二个选项: 将 d 转换为数据框并执行合并

d1 = pd.DataFrame.from_dict(d,orient='index',columns=['res'])
res = df.merge(d1,left_on='key',right_index=True)['res']

我们将不胜感激任何帮助(当然还有更好的解决方案:))

【问题讨论】:

    标签: python pandas performance dictionary join


    【解决方案1】:

    map 将比 merge 更快

    如果您的目标只是为 df['AB'] 中的每个唯一值分配一个数字类别,您可以使用应该比map 快一点的pandas.factorize

    res = df['AB'].factorize()[0]+1
    

    输出:array([1, 1, 1, 2, 2, 3, 3, 3])

    测试 800k 行:

    factorize   28.6 ms ± 153 µs 
    map         32.1 ms ± 110 µs
    merge       68.6 ms ± 1.33 ms
    

    【讨论】:

    • 我实际上需要分配一个特定的值,而不是一个数字类别。问题是我真正的数据字典键是这样的:'first_us_1000',我认为这会使地图变得很慢。
    • 你能提供一个真实的例子吗?没有真实数据的优化是不可能的;)
    • 刚刚编辑了帖子以包含我的数据样本
    猜你喜欢
    • 2018-05-10
    • 2020-11-11
    • 2017-12-23
    • 2019-11-25
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    相关资源
    最近更新 更多