首页 > 解决方案 > 通过 pandas 或 numpy 执行不规则行长度匹配的有效方法

问题描述

我有一个 table1 来执行类似 vlookup 的匹配,用 numpy 或 pandas 转换表以像这样重建表(使用 val1 查找相应类型并创建新表)最有效的是什么?

表格1:

| Type | Val1        |
|------|-------------|
| 1    | [d,e,f]     |
| 2    | [a,b,c,d,f] |
| 3    | [a,b,e,f]   |
| 4    | [a,c,d,f]   |
| 5    | [a,b,c,e,f] |
| 6    | [c,f]       |
| 7    | [a,b,c,e,f] |
| 8    | [c,e,f]     |
| 9    | [a,b,c,e]   |

预期表:

| Val1 | Type              |
|------|-------------------|
| a    | [2,3,4,5,6,9]     |
| b    | [2,3,5,7,9]       |
| c    | [2,4,5,6,7,8,9]   |
| d    | [1,2,4]           |
| e    | [1,3,5,7,8,9]     |
| f    | [1,2,3,4,5,6,7,8] |

非常感谢!

标签: python-3.xpandasnumpy

解决方案


这是一个具有列表理解的解决方案,它与 pandas 的方法一样快(甚至快一点):

s = df2.set_index('Type')['Val1']
# get the list of possible values
values = sorted(set([e for l in s.values for e in l]))
# get indices for each value
pd.Series({v: list(s2[s2].index)
           for v in values
           for s2 in [s.apply(lambda x: v in x)]
          }, name='Type').sort_index().rename_axis('Val1').reset_index()

输出:

  Val1                      Type
0    a        [2, 3, 4, 5, 7, 9]
1    b           [2, 3, 5, 7, 9]
2    c     [2, 4, 5, 6, 7, 8, 9]
3    d                 [1, 2, 4]
4    e        [1, 3, 5, 7, 8, 9]
5    f  [1, 2, 3, 4, 5, 6, 7, 8]

推荐阅读