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
文件夹内部构造:
二. 为什么需要用到pandas?
- 便于对数据进行快速查找与修改
- 可快速对数据进行排序、评价
- 便于修改用于深度学习的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)
四. 总结与分享
博文分享: