Python下的数据处理 - - - Pandas模块学习

Python自学_05


Pandas,是python+data+analysis的组合缩写,是python中基于numpy和matplotlib的第三方数据分析库,与后两者共同构成了python数据分析的基础工具包,享有数据分析三剑客之名。Pandas核心数据结构有两种,即一维的series和二维的dataframe,二者可以分别看做是在numpy一维数组和二维数组的基础上增加了相应的标签信息。(摘自:Pandas入门详细教程

一. 安装pandas,xlrd功能包及待处理文件

终端执行:

$ pip install pandas
$ pip install xlrd==1.2.0
$ cd “自己程序所保存的目录”
$ git clone https://github.com/KeithGalli/pandas.git

文件夹内部构造:
bydemo

二. 为什么需要用到pandas?
  1. 便于对数据进行快速查找与修改
  2. 可快速对数据进行排序、评价
  3. 便于修改用于深度学习的csv类文件
三. pandas功能详解

1. 数据加载

import pandas as pd

# 读取csv文件
print("pandas读取csv文件")
df = pd.read_csv("PandasFile/pokemon_data.csv")

print(df)  # 打印csv文件中的所有内容
print(df.head(3))  # 打印csv文件中的头三行内容
print(df.tail(3))  # 打印csv文件中的末尾三行内容

# 读取excel文件
print("pandas读取excel文件")
df_xlsx = pd.read_excel("PandasFile/pokemon_data.xlsx")
print(df_xlsx)

# 读取txt文件
print("pandas读取txt文件")
df_txt = pd.read_csv("PandasFile/pokemon_data.txt", delimiter='\t')  # delimiter的作用就是解决掉直接读取txt档时,会出现的无空格情况
print(df_txt)

2. 数据读取

import pandas as pd

df = pd.read_csv("PandasFile/pokemon_data.csv")

# 读取文件中的headers
print("读取headers")
print(df.columns)

# 读取文件中的指定列
print("读取指定Name列")
print(df['Name'])  # 方法一
print(df.Name)  # 方法二

# 读取文件中的指定列的指定行
print("读取指定列Name的0~5行")
print(df['Name'][0:5])

# 读取文件中的多列
print("读取Name列和HP列")
print(df[['Name', 'HP']])

# 读取文件中的指定行
print("读取第一行")
print(df.iloc[1])

# 读取文件中的多行
print("读取从第3行到第5行")
print(df.iloc[3:5])  # 注:前度后不读;也就是只读出来第三行和第四行

# 读取文件中的指定行指定列内存储的数据
print("读取第三行中的第二个元素 - Venusaur")  # 注:数数方式从0开始
print(df.iloc[2, 1])

3. 循环读取数据中的每一项

import pandas as pd

df = pd.read_csv("PandasFile/pokemon_data.csv")

# 循环读取文件中的内容
print("按照一个宝可梦作为一组数据的格式读取出来")
for index, row in df.iterrows():
    print(index, row)
    # print(index, row['Name'])  # 按照循环的模式,读取每一个宝可梦的编号以及姓名

4. 根据指定的属性获取部分数据

import pandas as pd

# 读取csv文件
print("pandas读取csv文件")
df = pd.read_csv("PandasFile/pokemon_data.csv")

# 按照具体到某一类去提取
print("提取出所有火属性的宝可梦")
print(df.loc[df['Type 1'] == "Fire"])

5. 自动对数据进行描述与评价

import pandas as pd

# 读取csv文件
print("pandas读取csv文件")
df = pd.read_csv("PandasFile/pokemon_data.csv")

# 对读取的数据进行自动描述,找些均值啊,最大最小值啊等等
print(df.describe())

6. 对数据进行排序处理

import pandas as pd

# 读取csv文件
print("pandas读取csv文件")
df = pd.read_csv("PandasFile/pokemon_data.csv")

# 按照首字母进行排列
print(df.sort_values('Name'))  # 按照字母表顺序正向排列(从A开始排列)
print(df.sort_values('Name', ascending=False))  # 按照字母表顺序逆向排列(从Z开始排列)
print(df.sort_values('Speed'))  # 按照Speed从低到高的顺序排列
print(df.sort_values('Speed', ascending=False))  # 按照Speed从高到低的顺序排列
print(df.sort_values(['Speed', 'Attack'], ascending=[False, True]))  # 按照Speed从高到低,攻击力从低到高的顺序排列

7. 对数据进行部分的修改

import pandas as pd

# 读取csv文件
print("pandas读取csv文件")
df = pd.read_csv("PandasFile/pokemon_data.csv")

# 通过将部分的属性值加起来得到最牛的宝可梦
df['Total'] = df['HP'] + df['Attack'] + df['Defense'] + df['Sp. Atk'] + df['Sp. Def'] + df['Speed']  # 构建一个新的项Total
print(df.head(5))

# 通过将部分的属性值加起来得到最牛的宝可梦  方法二
df['Total_1'] = df.iloc[:, 4:10].sum(axis=1)  # sum(axis=1)的意思就是横向的把从第4列开始到第10列的数加起来
print(df.head(5))

# 删掉数据中的部分列
df = df.drop(columns=['Total_1'])
print(df.head(5))

# 重新对数据的列的排列顺序进行修改
cols = list(df.columns.values)  # 将全部的表头按照列表的格式保存起来
print(cols)
df = df[cols[0:4] + [cols[-1]] + cols[4:12]]
print(df.head(5))

8. 将修改完的数据保存成新的数据

import pandas as pd

# 读取csv文件
print("pandas读取csv文件")
df = pd.read_csv("PandasFile/pokemon_data.csv")


# 通过将部分的属性值加起来得到最牛的宝可梦  方法二
df['Total'] = df.iloc[:, 4:10].sum(axis=1)  # sum(axis=1)的意思就是横向的把从第4列开始到第10列的数加起来
print(df.head(5))

# 重点来了:将调整后的CSV文件保存成一个新的CSV文件
df.to_csv('modified.csv', index=False)  # index=False 的意思就是不要index这列

# 将调整后的CSV文件保存成一个新的excel文件
df.to_excel('modified.xlsx', index=False)

# 将调整后的CSV文件保存成一个新的txt文件
df.to_csv('modified.txt', index=False, sep='\t')  # sep='\t'的作用是添加tab将每一列与每一列隔开

9. 对数据进行过滤

"""过滤数据"""

import pandas as pd
import re

# 读取csv文件
print("pandas读取csv文件")
df = pd.read_csv("PandasFile/pokemon_data.csv")

"""
使用loc定位,过滤掉不想要的数据
需要注意的一点是:过滤之后生成的新数据仍然保留着总数据的 index
"""
# 提取所有宝可梦中的草类宝可梦
grassClass = df.loc[df["Type 1"] == "Grass"]
print(grassClass)

# 提取所有宝可梦中的所有主属性草、副属性毒类的宝可梦
grass_poisonClass = df.loc[(df["Type 1"] == "Grass") & (df["Type 2"] == "Poison")]  # & 的意思为 and
print(grass_poisonClass)

# 提取所有宝可梦中的主属性火类或者主属性草类的宝可梦
fireOrGrassClass = df.loc[(df["Type 1"] == "Fire") | (df["Type 1"] == "Grass")]  # | 的意思为 or
print(fireOrGrassClass)

# 提取所有宝可梦中的主属性为草且副属性为毒且生命值大于70的所有宝可梦
grass_poisonHPClass = df.loc[(df["Type 1"] == "Grass") & (df["Type 2"] == "Poison") & (df["HP"] > 70)]
print(grass_poisonHPClass)

# 重设新的 index
grass_poisonHPClass = grass_poisonHPClass.reset_index()
print(grass_poisonHPClass)

# 将新生成的数据保存到新的csv文件中
# grass_poisonHPClass.to_csv("Filter1.csv")

# 提取出所有名字中含有Mega的宝可梦
megaClass = df.loc[(df["Name"].str.contains("Mega"))]
print(megaClass)

# 剔除掉所有名字中带有Mega的宝可梦
newData = df.loc[~(df["Name"].str.contains("Mega"))]  # ~ 的作用等同于!,也就是取反
print(newData)

# 提取出所有名字已Pi开头的宝可梦,需要用到 re 模块
piClass = df.loc[(df["Name"].str.contains("^pi[a-z]*", flags=re.I, regex=True))]  # flags=re.I 忽略大小写
print(piClass)

10. 批量修改数据所附带的属性

"""属性变更"""

import pandas as pd

# 读取csv文件
print("pandas读取csv文件")
df = pd.read_csv("PandasFile/pokemon_data.csv")

# 将所有主属性为火的宝可梦修改为主属性为 Sao
df.loc[df["Type 1"] == "Fire", "Type 1"] = "Sao"
print(df)

# 将所有草属性的宝可梦定义为legendary(传说级)
df.loc[df["Type 1"] == "Grass", "Legendary"] = True
print(df)

# 如果宝可梦的属性和超过了500,则将它的Generation和Legendary修改为SSS 和 True
df2 = pd.read_csv("modified.csv")
print(df2)

df2.loc[df2["Total"] > 500, ["Generation", "Legendary"]] = ["SSS", "True"]
print(df2)

11. 数据的重新组合

"""分组"""

import pandas as pd

# 读取csv文件
print("pandas读取csv文件")
df = pd.read_csv("PandasFile/pokemon_data.csv")

# 求出每个主属性宝可梦在各个能力上的平均值
print(df.groupby(["Type 1"]).mean())

# 根据防御值的大小将各个属性的宝可梦进行评级排列
print(df.groupby(["Type 1"]).mean().sort_values("Defense", ascending=False))

# 将所有同类型的宝可梦的属性进行求和计算
print(df.groupby(["Type 1"]).sum())

# 计算出各个属性的宝可梦都有多少种
df['count'] = 1  # 先给每个宝可梦后边加个1属性,用来做count
print(df.groupby(["Type 1"]).count()['count'])  # 仅打印出count这一列,让数据看起来更清爽一点

# 主属性,副属性count,也就是清晰地展示出,主属性为a的有几种副属性为b的宝可梦
print(df.groupby(["Type 1", "Type 2"]).count()["count"])

12. 对大规模数据的处理

"""
处理大规模数据
为的就是解决如果当你的总dataframe过大,一次性把里边的数据读取出来需要消耗巨大的时间
"""

import pandas as pd

# 一点一点地从总的dataframe里边读取出来部分dataframe
for df in pd.read_csv("modified.csv", chunksize=5):
    print("CHUNK DF")
    print(df)
四. 总结与分享

博文分享:

  1. Pandas入门详细教程
  2. pandas用法总结

如有问题,敬请指正。欢迎转载,但请注明出处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值