栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/339102.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号