pandas基础

7 pandas基础知识

学习第三方库的基本方法:

官方文档:https://pandas.pydata.org/docs/user_guide/10min.html

搜索引擎

AI模型

Pandas 是一个用于数据分析和处理的 Python 库,提供了高效的数据结构和操作工具。它主要通过 DataFrame Series 两种数据结构来处理表格型数据和一维数据,支持数据清洗、合并、分组、过滤、以及时间序列处理等功能。Pandas 以其简洁的 API 和强大的功能,广泛应用于数据科学、金融分析和统计等领域。

在训练神经网络模型时,需要处理大量的数据,pandas可以帮助我们高效地进行数据的加载、预处理和管理。通过pandas,我们可以轻松读取多种格式的数据文件(如CSVExcel等),并且可以对数据进行清洗、转换和筛选。这对于确保输入神经网络的数据格式正确、无缺失或异常值非常关键。此外,pandas还支持强大的数据操作功能,如分组聚合、合并数据集和生成统计信息,从而使我们能够在模型训练前对数据进行充分的探索与处理,提高模型的准确性和效率。

open-images-bus-trucks数据集包含15225张图片: 

图片中共包含24063个对象:

标注的图片如图所示:

如何获取用于学习的数据集:

1kaggle网站上有超过40万个数据集,涵盖计算机视觉、数据可视化、商业数据、机器学习、金融数据、医疗数据等诸多领域。 2、可以使用Python编写爬虫程序,爬取数据 3、问问kimi:我想学习数据分析,我可以通过哪些途径获取用于学习的数据?

kaggle注册以及使用教程:https://cv.kedaya.online/article/kaggle-tutorials/

本教程参考链接:https://pandas.pydata.org/docs/user_guide/10min.html#basic-data-structures-in-pandas

7.1 pandas的基本数据结构

pandas提供两个类来处理数据: Series:一维标签数组,用于存储任何类型的数据,如整数、字符串、Python对象等。 DataFrame:二维数据结构,存储数据类似于二维数组或带有行和列的表格。

7.2 创建pandas对象

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)

7.2.1 创建:Series

通过传递一个序列对象来创建一个Seriespandas会创建一个默认的RangeIndex索引。

s = pd.Series([1, 3, 5, np.nan, 6, 8])
s

7.2.2 创建DataFrame

通过传递一个带有datetime索引的NumPy数组并使用date_range()以及标记列来创建一个DataFrame 注:datetimePython中用于处理日期和时间的模块,它提供了日期、时间、时区和时差的类和函数。

#创建datetime数组
dates = pd.date_range("20130101", periods=6)
dates

#随机产生64列数据,以datetime数组为索引,以['A', 'B', 'C', 'D']为列标记
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list("ABCD"))
df

通过传入字典对象创建DataFrame,字典的键即为DataFrame的列标记,字典的值则为DataFrame的值。

df2 = pd.DataFrame(
    {
        "A": 1.0,
        "B": pd.Timestamp("20130102"),
        "C": pd.Series(1, index=list(range(4)), dtype="float32"),
        "D": np.array([3] * 4, dtype="int32"),
        "E": pd.Categorical(["test", "train", "test", "train"]),
        "F": "foo",
    }
)
df2

DataFrame中的列为不同的数据类型(dtypes)。

df2.dtypes

复习:dir()help()函数 DataFrame有很多的属性和方法,如果不记得一个对象所包含的方法,可以使用dir()函数来查看, 如果不记得方法的调用方法,可以使用help()函数查看。

#使用dir()函数查看对象的属性与方法,其中也双下划线开头的为特殊方法,通常无需直接调用,而是由Python解释器调用,以单下划线开头的是私有方法
dir(df2)

#使用help()函数查看方法的调用方法
help(df2.to_csv)

7.3 查看数据

7.3.1 使用 DataFrame.head() DataFrame.tail() 查看前n行和后n行的数据。

#查看前5行的数据
df.head(5)

#查看后5行的数据
df.tail(5)

7.3.2 查看索引和列标记

df.index

df.columns

7.3.3 DataFrame对象转化为NumPy对象,但不包括索引或列标记。

df.to_numpy()

7.3.4 使用describe()查看数据的快速统计摘要

df.describe()

7.3.5 将数据行列转置

df.T

7.3.6 将数据按轴排序

df.sort_index(axis=1, ascending=False)

7.3.7 将数据按值排序

df.sort_values(by="B")

7.4 选择数据

7.4.1 选择A列数据,传入要选择的列标记,会返回一个Series对象。

df["A"#等效df.A

7.4.2 按标签选择数据

df.loc[dates[0]]

选择所有行的”A””B”列数据

#与列表类型的切片相似如果起始值缺失则从第一个元素开始,结尾值缺失则到最后一个元素。
df.loc[:, ["A", "B"]]

选择行索引为”20130102”:“20130104”,列标记为”A”, “B”的数据

df.loc["20130102":"20130104", ["A", "B"]]

选择单个行和列标签将返回一个标量值

df.loc[dates[0], "A"]

7.4.3 通过位置来获取值

df.iloc[3]

使用切片来获取数据,与Python中的切片类似

df.iloc[3:5, 0:2]

使用整数索引来获取值

df.iloc[[1, 2, 4], [0, 2]]

使用切片获取数据

df.iloc[:, 1:3]

获取第n行第n列的元素

df.iloc[1, 1]

7.4.4 布尔索引

选择第A列的值大于0的行

df[df["A"] > 0]

选择满足条件的DataFrame中的值

df[df > 0]

使用isin() 方法来过滤值

df2 = df.copy()
df2["E"] = ["one", "one", "two", "three", "four", "three"]
print(df2)
df2[df2["E"].isin(["two", "four"])]

7.4.5 设置DataFrame的值

设置一个新列会自动根据索引对齐数据

s1 = pd.Series([1, 2, 3, 4, 5, 6], index=pd.date_range("20130102", periods=6))
s1

df

df["F"] = s1   #s1的索引变为了原DataFrame的索引
df

按标签设置元素的值

df.at[dates[0], "A"] = 0  #0索引,A列的值修改为0
df

按位置设置元素的值

df.iat[0, 1] = 0  #1行第2列的值修改为0
df

使用NumPy数值修改DataFrame的值

df.loc[:, "D"] = np.array([5] * len(df))
df

使用where操作来设置元素的值

df2 = df.copy()
df2[df2 > 0] = -df2   #where df2 > 0的元素,将其值修改对对应的df2元素的负值
df2

7.5 处理缺失值

7.5.1 重新索引(Reindexing)应许你针对特定的轴修改/增加/删除索引值,并返回一个数据的副本。

df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ["E"])    #使用第1到第4行的值重新索引,并增加E
df1.loc[dates[0] : dates[1], "E"] = 1                                   #12行,E列的值修改为1
df1

7.5.2 使用DataFrame.dropna()方法丢弃缺失值

df1.dropna(how="any")     #不会直接修改原DataFrame,而是返回一个新的DataFrame对象

7.5.3 使用DataFrame.fillna()填充缺失值

df1.fillna(value=5)

7.5.4 使用isna()查看缺失值

pd.isna(df1)

7.6 DataFrame的操作

7.6.1 统计操作

计算每列的平均值

df.mean()

计算每行的平均值

df.mean(axis=1)

关于DataFrame中的轴

A = [
      [1,2],
      [3,4],
      [5,6],
      [7,8],
    ]
d = pd.DataFrame(A)
d

shift()Series中的值沿着索引轴进行位移。数字2表示向右移动2个位置。位移操作会将原来的值向下移动2个位置,顶部的2个位置将被填充为NaN(即np.nan)。

s = pd.Series([1, 3, 5, np.nan, 6, 8], index=dates).shift(2)   #创建[1,3,5,NaN,6,8]Series对象,然后
s

sub(s): 这是DataFrame的减法方法。它将Series中的值从DataFrame中逐个元素减去。

df

df.sub(s, axis="index")   #沿着水平轴(行)的方向,Series的索引将与DataFrame的列标签进行对齐,然后逐个元素相减。

7.6.2 用户定义函数

df.transform(lambda x: x * 101.2)   #类似于excel中的数组函数,将函数应用于每个元素

7.6.3 计算Series中每个唯一值出现的频率

s = pd.Series(np.random.randint(0, 7, size=10))
s.value_counts()

7.6.4 拆分DataFrame

df = pd.DataFrame(np.random.randn(10, 4))
print(df)
pieces = [df[:3], df[3:7], df[7:]]
pieces[0]

7.7 分组

分组(grouping)是指根据某些标准将数据分割成组,对每个组分别应用函数,然后将结果合并成数据结构的过程。

df = pd.DataFrame(
    {
        "A": ["foo", "bar", "foo", "bar", "foo", "bar", "foo", "foo"],
        "B": ["one", "one", "two", "three", "two", "two", "one", "three"],
        "C": np.random.randn(8),
        "D": np.random.randn(8),
    }
)
df

df.groupby("A")[["C", "D"]].sum()   #A列进行分组,然后按组对CD列求和

7.8 DataFrame的形状操作

7.8.1 堆叠(stack):数据的堆叠操作,用于将DataFrame的列旋转为行。

arrays = [
   ["bar", "bar", "baz", "baz", "foo", "foo", "qux", "qux"],
   ["one", "two", "one", "two", "one", "two", "one", "two"],
]

index = pd.MultiIndex.from_arrays(arrays, names=["first", "second"])   #建立两个索引

df = pd.DataFrame(np.random.randn(8, 2), index=index, columns=["A", "B"])

df2 = df[0:4]

df2

stacked = df2.stack(future_stack=True)   #future_stack=True保存与新版本的兼容性
stacked

反堆叠(unstack):用于将多级索引的Series转换回DataFrame

stacked.unstack()

stacked.unstack(1)

stacked.unstack(0)

7.8.2 数据透视(Pivot tables

df = pd.DataFrame(
    {
        "姓名": ["可达鸭", "杰尼龟", "比卡丘", "妙蛙种子"] * 3,
        "商品": ["薯条", "汉堡", "可乐","麦辣鸡翅","汉堡", "可乐"] * 2,
        "单价": [10, 15, 5, 12] * 3,
        "数量": np.random.randint(10, 21, size=12),
    }
)
df['金额'] = df['单价'] * df['数量']

df

pd.pivot_table(df, values="金额", index=["姓名"], columns=["商品"],aggfunc=["sum", "mean"])

7.9 DataFrame练习

使用爬虫爬取咖啡销售数据,然后使用pandas进行分析。 爬虫程序地址:https://cv.kedaya.online/article/python-web-crawler-example-taoke-data-scraping/

!pip install requests   #安装requests
import os
import json
import re
import csv
from datetime import datetime
import requests


def getdata(kw):
    """kw为要爬取的商品名"""
    items = []
    i = 1
    #爬取数据
    while True:
        url = "http://dtkapi.ffquan.cn/go_getway/proxy/search?platform=1&page={}&sortType=4&kw={}&api_v=1".format(i,str(kw))
        r = requests.get(url)
        html = r.text
        data = json.loads(html)
        if  data['data']['search']['list']:
            for good in data['data']['search']['list']:
                item = {}
                title = good["d_title"]
                gg = re.findall(r"[1-9]\d*",title)
                if len(gg) == 2:
                    if float(gg[0]) > float(gg[1]):
                        gg[0],gg[1] = gg[1],gg[0]
                count = 0
                if len(gg) != 0:
                    count = gg[0]
                item = {'品牌':good["brand_name"],'标题':good["d_title"],'链接':good["item_link"],'原价':good["original_price"],'优惠券':good["coupon_amount"],'优惠券链接':good["coupon_link"],'券后价':good["price"],'佣金比例':good["commission_rate"],'佣金':good["direct_commission"],'2小时销量':good["sales_2h"],'日销量':good["sales_daily"],'总销量':good["sales"],'count':count}
                items.append(item)
            i += 1
            continue
        else:
            break
    #如果爬取到数据,在将数据保存为csv文件
    if items:
        t = datetime.now().strftime("%Y%m%d%H%M%S")
        filename = f'data{t}.csv'
        with open(filename, 'w', encoding='utf-8-sig', newline='') as csvfile:
            fieldnames = items[0].keys()
            writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
            writer.writeheader()
            for data in items:
                writer.writerow(data)
        c = len(items)
        current_path = os.getcwd()
        print(f"成功爬取{c}条数据,文件{filename},保存在{current_path}目录。")

if __name__ == "__main__":
    r = getdata("咖啡")

#首先安装pandas库,在命令行输入:pip install pandas
#导入pandas
import pandas as pd
#读取csv文件,将文件名修改为你的文件名
df = pd.read_csv("/kaggle/working/data20241024035055.csv")

pd.set_option('display.max_rows', None# 设置显示所有行
pd.set_option('display.max_columns', None# 设置显示所有列
pd.set_option('display.width', None# 设置显示宽度,None表示根据内容自动调整

练习1:处理异常值,将品牌列中缺失的数据填充为其他

提示:使用fillna()方法,参考7.5.3

#答案
df1 = df.fillna(value='其他')
print(df1)

练习2:将数据按照总销量排序

提示:使用df.sort_values()方法,参考7.3.7

#答案
df2 = df.sort_values(by='总销量', ascending=False)
print(df2)

练习3:选取总销量大于10000的商品

提示:参考7.4.4布尔索引

#答案
df3 = df[df["总销量"] > 10000]
print(df3)

练习4:计算售价的平均数,中位数

提示: 1、使用df[‘券后价’]券后价列转Seriese,参考7.4.1 2、然后使用.mean().median()方法计算平均数和中位数,参考7.6.1统计操作

average_price = df['券后价'].dropna().mean()
median_price = df['券后价'].dropna().median()
print(median_price,average_price)

练习5:统计品牌上榜次数

提示: 1、使用df[‘品牌’]品牌列转化为Series,参考7.4.1 2、然后使用value_counts()方法,计算Series中每个唯一值出现的次数,参考7.6.3

#答案
series_a = df['品牌']
print(series_a.value_counts())

练习6:查看雀巢瑞幸咖啡“g 7 coffee”三个品牌的销售数据

提示:使用isin()方法,参考7.4.4布尔布索引

#答案
df6 = df[df['品牌'].isin(['雀巢','瑞幸咖啡','g 7 coffee'])]
print(df6.head(20))

 

 

notebook链接:https://www.kaggle.com/code/jeanshendev/pandas-basics

 

下载本节的示例代码及文件:pandas-basics_e5wyQ1T.ipynb