python-3.x - 通过 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] |
非常感谢!
解决方案
这是一个具有列表理解的解决方案,它与 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]
推荐阅读
- excel - 将不同范围的单元格从 Excel 发送给不同的人
- javascript - 如何处理参数选项?
- reactjs - 为什么我的网站没有重定向到社交网站而是 mydomain/facebook?
- db2 - 从 BPM 升级到 BAW 之前的 DB2 数据库备份
- ios - Xcode LLDB 可以在 Swift 中观察 Object-C 变量吗?
- php - 限制对 WordPress 文件的直接访问
- python - Python socket.gaierror:[Errno 11001] getaddrinfo 失败
- python - Python pyautogui bot 工作一段时间后出现 TypeError: cannot unpack non-iterable NoneType object 解决方法
- python - 如何在 Python 中获取两个浮点值数据框之间的百分比相似度?
- python - ModuleNotFoundError:没有名为“dmidecode”的模块