前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 中的 pandas 快速上手之:概念初识

Python 中的 pandas 快速上手之:概念初识

作者头像
用户4945346
发布2024-05-18 09:02:35
1080
发布2024-05-18 09:02:35
举报
文章被收录于专栏:pythonista的日常pythonista的日常

Pandas 是一个非常厉害的 Python 库,它可以帮助我们更简单高效地处理各种形式的数据。你可以把它想象成一个数据魔术师,能将各种数据如 excel表格、数据库、网页数据等变成Python可以理解和操作的形式。有了 Pandas ,我们不用手动一行一行地读取数据,也不用手动将数据装进 Python 可以使用的数据结构中。Pandas 可以自动帮我们完成这些重复的工作,节省了大量时间和精力。

除此之外,Pandas 还提供了大量实用的函数,方便我们对数据进行各种统计分析、清洗、整理、可视化等处理,是数据分析和处理必不可少的利器。

大家可能会觉得 Python 自带的库已经够用了,为什么还要学习 Pandas 呢?我们来看一个实际的例子。

假设你手上有一个包含 10 万行数据的csv文件,文件里只有两列:timetamp 和 gas_pedal。你需要根据给定的一个目标时间,从这 10万 行数据里找到最接近这个目标时间的那一行,并返回对应的 gas_pedal 值。听起来是不是有点麻烦?

如果只用Python内置的库,你得自己先把整个 csv 文件读进内存,然后一行行遍历所有数据,计算每个时间戳与目标时间的差值,使用二分查找定位找到需要的值, 找出差值最小的那一行。做这些步骤都需要自己动手写很多代码。代码如下:

代码语言:javascript
复制
import csv

def find_nearest(target, csv_file):
    """
    根据目标数字在排序的CSV文件中查找最接近的数字及对应的值
    
    参数:
    target (int/float): 目标数字
    csv_file (str): CSV文件路径
    
    返回:
    tuple: 最接近的数字和对应的值
    """
    # 打开CSV文件
    with open(csv_file, 'r') as file:
        reader = csv.reader(file)
        
        # 将CSV文件中的数字存入列表
        nums = [float(row[0]) for row in reader]
        
        # 二分查找
        left = 0
        right = len(nums) - 1
        
        while left <= right:
            mid = (left + right) // 2
            
            if nums[mid] == target:
                # 找到目标数字
                nearest_num = nums[mid]
                nearest_val = next(row[1] for row in reader if float(row[0]) == nearest_num)
                return (nearest_num, nearest_val)
            elif nums[mid] < target:
                # 目标数字在右半部分
                left = mid + 1
            else:
                # 目标数字在左半部分
                right = mid - 1
        
        # 没有找到目标数字,返回最接近的数字及对应的值
        nearest_idx = right if right >= 0 and abs(nums[right] - target) < abs(nums[left] - target) else left
        nearest_num = nums[nearest_idx]
        nearest_val = next(row[1] for row in reader if float(row[0]) == nearest_num)
        return (nearest_num, nearest_val)

# 使用示例
target = 1687160644552479420
csv_file = 'ins_can_000000_gaspedel.csv'
nearest_num, nearest_val = find_nearest(target, csv_file)
print(f"离目标数字 {target} 最近的数字是 {nearest_num}, 对应的值为 {nearest_val}")

但如果用了Pandas,整个过程就简单多了!Pandas 可以几行代码就把 csv 读进来,存在一个类似 Excel 表格的数据结构中。然后利用 Pandas 强大的运算能力,几行代码就能算出每个时间戳与目标时间的差值,再找出最小差值对应的那一行数据,返回所需的timetamp 和 gas_pedal。

代码语言:javascript
复制
import pandas as pd

# 读取 csv 文件内容
pd_csv = pd.read_csv("ins_can_000000_gaspedel.csv")
print(pd_csv) # pd_csv 输出
"""
                 timestamp  gas_pedal
0      1687160644552313854     0.0000
1      1687160644552368280     0.0000
2      1687160644552419868     0.0000
3      1687160644552479422     0.0000
4      1687160644552531764     0.0000
...                    ...        ...
110759  1687160857514424803        NaN
110760  1687160857534642423    22.0472
110761  1687160857554423051    22.0472
110762  1687160857617684338    22.0472
110763  1687160857617750929        NaN

[10764 rows x 2 columns]
"""

# 通过向量操作,获取与目标值最接近那一行的索引值
idx = (pd_csv["timestamp"] - target).abs().idxmin()

# 根据索引值获取需要的结果
nearest_num, nearest_value = pd_csv.loc[idx, ['timestamp', 'gas_pedal']]
print(f"离目标数字 {target} 最近的数字是 {nearest_num}, 对应的值为 {nearest_val}")

是不是感觉比用 Python 内置库要简单高效许多? Pandas 就是这么一个神奇的工具,能让处理大量数据如此轻松愉快。不只是 csv,它还支持字典 cidt、excel、数据库等各种常用数据格式。

下面来了解 pandas 的基础概念。

代码语言:javascript
复制
import pandas as pd

data = {'Name': ['Alice', 'Bob', 'Claire'],
        'Age': [25, 30, 42],
        'Weight': [55.0, 72.5, 61.0]}

res = pd.DataFrame(data)
代码语言:javascript
复制
In [2]: res = pd.DataFrame(data)
   ...: print(res)
   
     Name  Age  Weight
0   Alice   25    55.0
1     Bob   30    72.5
2  Claire   42    61.0

Series:

是一种一维的数组对象,它可以存储任意数据类型的数据, Name 列是一个字符串类型的 Series,同理 Age 列是一个整数类型的 Series

代码语言:javascript
复制
In [3]: print(res["Name"])

0     Alice
1       Bob
2    Claire
Name: Name, dtype: object

DataFrame:

DataFrame 是一个二维的带标签数据结构,就像一个Excel表格,上面的 res 就是 DataFrame 对象。它包含多个按列排列的 Series 对象,每列可以有不同的数据类型(这里是字符串和浮点数)。行和列都有标签索引(这里行是 0 1 2,列是 Name Age Weight)。

Index:

在这个DataFrame中,有两个Index:

1.行索引(Row Index)

这里的行索引是 0, 1, 2, 它标识了 DataFrame 中的每一行记录

2.列索引(Column Index)

这里的列索引是 Name, Age, Weight, 它标识了 DataFrame 中的每一列

代码语言:javascript
复制
In [5]: print(res.index)
RangeIndex(start=0, stop=3, step=1)
In [6]: print(res.columns)
Index(['Name', 'Age', 'Weight'], dtype='object')

行索引和列索引允许我们通过标签来快速查找、选择和操作 DataFrame 中 的数据。总之, Index 是 Pandas 中的关键概念, DataFrame 有行索引和列索引,允许我们方便地引用数据。

代码语言:javascript
复制
# 将返回第0行
In [7]: res.loc[0]
Out[7]: 
Name      Alice
Age          25
Weight     55.0
Name: 0, dtype: object
# 将返回'Age'这一列
In [8]: res['Age']
Out[8]: 
0    25
1    30
2    42
Name: Age, dtype: int6

通过上面的讲解的方式,可以更好地理解 Pandas 中这些核心数据结构的概念和布局。Series 就像是一个带标签的一维数组, DataFrame 是由 Series 组成的二维表格,Index 则为数据标注标签。它们的高效组合和丰富的数据操作方法,构成了 Pandas 作为数据分析利器的强大功能。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 pythonista的日常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档