上一篇文章我们讲到如何用一行代码检索目标字符串是否包含一个或多个关键字:
但是这行代码是我在处理另一个问题时遇到并顺带解决的:
已知值,如何根据值来查找其所对应的位置呢?
据我所知,在查找了csdn和pandas的官方文档之后,目前都还没有看到过有人提出过这一问题的解决方案。pandas似乎并没有提供一个方法可以直接根据值查找位置,而只能在至少确定行或者列其中一项以后才能进行查找。例如:
当我们先给出一个数据框:
name = ['小明', '小红', '小张']
code = ['001', '002', '003']
score = ['100', '90', '80']
table_dict = dict(姓名=name,
学号=code,
成绩=score)
table = pd.DataFrame(table_dict)
Out[11]:
姓名 学号 成绩
0 小明 001 100
1 小红 002 90
2 小张 003 80
然后给定列查找值所在行的方式可以是:
In: table.query('姓名 ==["小明"]')
Out:
姓名 学号 成绩
0 小明 001 100
但是并没有一种方法可以根据已知的值来寻找对应的坐标,比如说我需要某一字符串旁边的内容,那么就需要重新写一段代码来实现。我暂时没有在网上找到现成的解决方案,因此我自己写了一段代码和大家分享:
需求:根据值查找位置信息
这个东西有点像在excel或者pdf里面按CTRL+F查找关键词一样:
解决方案:
import pandas as pd
from typing import List, Tuple, Dict
def set_dataframe():
name = ['小明', '小红', '小张']
code = ['001', '002', '003']
score = ['100', '90', '80']
table_dict = dict(姓名=name,
学号=code,
成绩=score)
table = pd.DataFrame(table_dict)
return table
def table_find_col(table: object, value: str) -> List[str]:
value_col_list = []
for col in table.columns:
if value in table[col].values:
value_col_list.append(col)
return value_col_list
def table_find_row(table: object, col_list: List[str], value: str) -> List[Tuple[str]]:
col_row_list = []
for col in col_list:
row_list = table.query(f'{col} =="{value}"').index
for row in row_list:
col_row_list.append((col, row))
return col_row_list
def table_find_pos(table: object, value_list: List[str]) -> Dict[List[str], List[Tuple[str]]]:
position_list = []
for value in value_list:
# col_list 一个值可能被很多列包含
col_list = table_find_col(table, value)
# row_list 在每一个包含value的列中搜索对应的row
col_row_list = table_find_row(table, col_list, value)
position_list.append(col_row_list)
position_dict = dict(zip(value_list, position_list))
return position_dict
if __name__ == '__main__':
# 设置表格
table = set_dataframe()
# 设置需要寻找的关键词
value_list = ['小明', '002', '80']
# 获得结果
position_dict = table_find_pos(table, value_list)
# 关于如何取出结果:
value = '小明'
# 根据结果取出value所在列:
table[position_dict.get(value)[0][0]]
# 根据结果取出value所在行:
table.iloc[position_dict.get(value)[0][1]]
print(position_dict)
结果展示:
{'小明': [('姓名', 0)], '002': [('学号', 1)], '80': [('成绩', 2)]}
因为这里用的数据框较为简单,但是在实际应用中这段代码的鲁棒性是很强的,可以检索出所有包含关键词的位置。本来这段代码只有不到十五行,但是为了泛用性一下子就膨胀到五十行了。。。
思路解析:
1. 找到包含关键词的所有列。
2. 找到每一包含关键词的列中包含关键词的行。
3. 将信息组合成一个Dict(value=position_list)的字典,键值对为关键词与所有包含此关键词的位置信息。
第一次尝试用mermaid来画图解释代码,还有待研究优化。
“互联网精神”即:开放、平等、协作、快速、分享
对更多内容感兴趣欢迎关注我的个人公众号:梧承 Book House