pandas 查询某行记录 速度优化!(速度提升10倍以上)

本文通过对比Pandas中query、loc、at和iat方法,详细分析了如何在200万条数据中快速查找特定ID对应的信息,最终发现设置好index后使用iat方法能将查询速度提升300倍。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近,为了提高数据量为200多万数据的查询速度,可是费了老大功夫。下面是一些实验,最后有总结。

前提说明:   你已经知道所找数据的 id(key),需要在dataframe中找到你需要的数据。

实验一:pandas 的 query方法 ,(fu_gongxu为一个 id数组,gongxu为dataframe。)

mubiao = gongxu.query('key == {}'.format(fu_gongxu))

运行时间:0.3142213821411133, 速度还行,但是100个 fu_gongxu 数组会等半小时的。

实验二:pandas 的 loc方法

mubiao = gongxu.loc[gongxu['key'].isin(fu_gongxu)]

运行时间:0.2902202606201172 ,速度提升一点

实验三:pandas的 at方法,

for i in fu_gongxu:
    mubiao.append('{} {} {} {} {}{}'.format(gongxu.at[int(i),'key'],

                           gongxu.at[int(i),'UNIT_CAPTION'],gongxu.at[int(i),'PRODUCT_TIME_START'],

                           gongxu.at[int(i),'MATERIAL_ID'],gongxu.at[int(i),'PRODUCT_ID'],gongxu.at[int(i),'CREW_OPT']))

运行时间:0.1611170768737793 ,速度快一倍。

实验四:pandas的 iat方法

gongxu.set_index('key',inplace=True)

for i in fu_gongxu:
    mubiao.append('{} {} {} {} {} {}'.format(gongxu.iat[int(i), 18], gongxu.iat[int(i), 1],
                                             gongxu.iat[int(i), 3], gongxu.iat[int(i), 4],
                                             gongxu.iat[int(i), 5], gongxu.iat[int(i), 16]))

运行时间:0.025017261505126953 ,快了10-20,(前提设置好index 后,再计算时间与处理)

 

总结

设置好index后,用iat查询,查询速度很快,可以忽略。我把前面的查询也用这种方式处理,最后运行时间:0.00099945068359375,速度提升300倍。以后不管是查询多少数据都可以很快给出。

有帮助的话,就点个赞支持一下!

<think>好的,用户的问题是关于如何在Pandas查询某列特定值对应的行,并获取该行中另一列的具体值。我之前已经回答过关于筛选行的方法,现在需要进一步解决如何提取特定列的值。 首先,回顾之前的回答,用户已经知道使用布尔索引筛选行。比如df[df['age'] == 30]来获取符合条件的行。现在用户的需求是,在筛选出这些行后,还要获取其中某一列的值,比如获取这些行的'name'列。 接下来,我需要考虑用户可能的几种情况。例如,用户可能只需要第一个匹配项的值,或者所有匹配项的值,或者是将这些值转换为列表或其他数据结构。此外,还要处理可能出现的多个匹配行或没有匹配的情况,避免报错。 然后,结合用户提供的引用内容,引用[1]提到数据清洗和过滤,引用[2]涉及删除指定行和重置索引。这些信息提示用户可能在处理真实数据集,需要处理索引或数据清理后的操作。比如,在删除某些行后,使用reset_index后如何正确获取值。 我需要分步骤给出解决方案。首先,使用布尔索引筛选行,然后选择特定列。例如,df.loc[df['age'] == 30, 'name']。需要解释loc的用法,以及如何避免SettingWithCopyWarning的问题,建议使用.copy()。 还要考虑用户可能需要不同的输出形式,比如单个值、Series、列表或数组。因此,提供多个方法,如.values、tolist()、iloc[0]等,并说明适用场景。 另外,用户可能需要处理重复值的情况,比如获取所有匹配的值,或者去重后的结果。这时候需要提到unique()方法。 最后,结合性能优化,比如使用astype转换分类数据,特别是在处理大型数据集时,提升查询效率。同时,提醒用户注意数据类型和缺失值的处理,比如使用dropna()或fillna()。 总结回答结构:先基础方法,再进阶方法,然后是性能优化,最后常见问题处理。确保覆盖用户可能的各种需求,并提供代码示例和解释,让用户能直接应用。</think>在Pandas查询某列特定值对应行的某一列具体值,可以通过以下分步实现: --- ### 一、基础方法 #### 1. 精确匹配单值 ```python # 筛选age列=30的行,并获取name列值 names = df.loc[df['age'] == 30, 'name'] # 返回Series对象 ``` - 输出结果示例: ``` 5 张三 8 李四 Name: name, dtype: object ``` #### 2. 获取首个匹配值 ```python first_name = df.loc[df['age'] == 30, 'name'].iloc[0] # 获取第一个匹配值 ``` --- ### 二、进阶方法 #### 1. 多条件筛选取值 ```python # 筛选age>25且city='北京'的行,获取salary列 salaries = df.loc[(df['age'] > 25) & (df['city'] == '北京'), 'salary'] ``` #### 2. 处理重复值 ```python # 获取所有不重复的匹配值 unique_names = df.loc[df['dept'] == 'IT', 'employee_id'].unique() ``` --- ### 三、输出格式转换 | 需求类型 | 代码实现 | 输出形式 | |-----------------|-------------------------------------------|------------------| | 获取Numpy数组 | `.values` | array([值1, 值2])| | 转换为Python列表| `.tolist()` | [值1, 值2] | | 获取标量值 | `.values[0]` 或 `.iloc[0]` | 单个值 | 示例: ```python # 转换为列表 name_list = df.loc[df['age'] == 30, 'name'].tolist() # 输出:['张三', '李四'] # 获取第一个值的字符串形式 first_name_str = df.loc[df['age'] == 30, 'name'].values[0] ``` --- ### 四、性能优化方案 1. **建立索引加速查询**: ```python df_indexed = df.set_index('user_id') # 建立索引 value = df_indexed.loc[1001, 'username'] # 直接通过索引定位 ``` 2. **分类数据类型优化**: ```python df['city'] = df['city'].astype('category') # 转换为分类数据 filter_values = df.loc[df['city'] == '北京', 'population'] ``` --- ### 五、异常处理 #### 1. 处理无匹配值 ```python try: result = df.loc[df['product'] == 'X1', 'price'].iloc[0] except IndexError: result = "未找到匹配记录" ``` #### 2. 处理空值 ```python # 筛选时排除空值 valid_emails = df.loc[df['department'].eq('HR') & df['email'].notna(), 'email'] ``` --- ### 六、完整工作流示例 ```python # 创建示例数据 import pandas as pd df = pd.DataFrame({ 'id': [101, 102, 103], 'city': ['北京', '上海', '北京'], 'sales': [25000, 32000, 41000] }) # 1. 筛选北京地区记录 beijing_sales = df.loc[df['city'] == '北京', 'sales'] # 2. 转换为百分比字符串 formatted_sales = beijing_sales.apply(lambda x: f"¥{x/1000:.1f}k") # 输出结果 print("北京地区销售额:", formatted_sales.tolist()) # 输出:北京地区销售额:['¥25.0k', '¥41.0k'] ``` --- ### 常见问题解决 1. **SettingWithCopyWarning警告**: - 解决方案:添加`.copy()` ```python target_value = df[df['id'] == 1001].copy().loc[:, 'value'] ``` 2. **多值匹配去重**: ```python unique_values = df.loc[df['status'].isin(['active', 'pending']), 'user_id'].drop_duplicates() ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值