如何在dataframe中根据值查找值所在位置——一个似乎被很多人忽略的问题

上一篇文章我们讲到如何用一行代码检索目标字符串是否包含一个或多个关键字:

如何一行代码检索是否包含list中的一个或全部目标关键词?

但是这行代码是我在处理另一个问题时遇到并顺带解决的:

已知值,如何根据值来查找其所对应的位置呢?

据我所知,在查找了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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值