文章目录
前言
Pandas 是一个开源的第三方 Python 库,从 Numpy 和 Matplotlib 的基础上构建而来,享有数据分析“三剑客之一”的盛名(NumPy、Matplotlib、Pandas)。具有强大的数值计算能力,是Python数据分析的重要角色。 本文使用csv,excel文件进行讲解,且主要讲Series、DataFrame两种数据结构,易于理解。
一、两种重要的数据结构(Series、DataFrame)
1.Series(“一维数组”)
Series是类似一维数组的一种对象,它由一组对象及它的索引组成。
创建一个简单的Series对象
import pandas as pd
p = pd.Series(["a", "b", "cdefg", "1", 2]) #列表
print(p)
指定索引
import pandas as pd
p = pd.Series({"a":"一","b":2,"c":"3"}) # 字典
print(p)
指定索引,index参数
import pandas as pd
p = pd.Series(["a", "b", "cdefg", "1", 2],index=[1,2,3,4,"五"])
print(p)
index获取索引
import pandas as pd
p = pd.Series(["a", "b", "cdefg", "1", 2],index=[1,2,3,4,"五"])
print(p.index)
values获取值
import pandas as pd
p = pd.Series(["a", "b", "cdefg", "1", 2], index=[1, 2, 3, 4, "五"])
print(p.values, type(p.values), p.values[0], sep="\n")
2.DataFrame(“类似Excel”)
二维数据结构,一组数据对应一对行列索引,像Excel表格。一般用其打开表格数据。
import pandas as pd
df=pd.DataFrame(pd.read_excel("aa.xlsx")) # xxx.csv
print(df)
创建一个DataFrame
import pandas as pd
d = pd.DataFrame(['a', 'b', 'c', 'd'])
print(d)
通过嵌套列表创建DataFrame
import pandas as pd
d = pd.DataFrame(['a', 'b', 'c', 'd'], [1, 2, 3, 4]) # index=[1,2,3,4],并不是嵌套(注意)
d1 = pd.DataFrame([['a', 'b', 'c', 'd'], [1, 2, 3, 4]])
d2 = pd.DataFrame([[1], [2, 2], [3, 3, 3]])
print(d, d1, d2, sep="\n\n")
columns指定列索引
import pandas as pd
d = pd.DataFrame([['a', '一'], ['b', '二']], columns=['字母', '数字'])
print(d)
index行索引
import pandas as pd
d = pd.DataFrame([['a', '一'], ['b', '二']], columns=['字母', '数字'],index=["AAA","BBB"])
print(d)
传入字典,键为列索引
import pandas as pd
d = pd.DataFrame({"字母": ['a', 'b', 'c', 'd'], "数字": [1, 2, 3, 4]}) # 字典值的长度不一样会报错
print(d)
columns获取列索引,index获取行索引
import pandas as pd
d = pd.DataFrame({"字母": ['a', 'b', 'c', 'd'], "数字": [1, 2, 3, 4]}) # 字典值的长度不一样会报错
print(d.columns, d.index)
二、读取、写入数据
读取Excel,csv文件
import pandas as pd
df=pd.read_excel("文件名.xlsx") #读取Excel
df1=pd.read_csv("xxx.csv",encoding="utf-8",sep=",") # 读取csv文件
读取其他格式的文件
使用pycharm的小伙伴,可以先按住Ctrl键,将鼠标移到导包pandas关键字,当关键字出现下划线时,再点击pandas,查看源代码,查看其他文件读取函数及参数设置。该方法适合所有模块查看源代码。
将数据写入文件(以csv,Excel为例)
import pandas as pd
df = pd.read_excel("zzz.xlsx")
df1 = pd.read_csv("xxx.csv", encoding="utf-8", sep=",")
df.to_excel("zzzzz.xslx")
df1.to_csv("yyy.csv")
"""
多学一招
当我们使用Excel查看csv文件时,或者直接修改后缀名(.csv改成.xlsx)时,会出现乱码。这时需要我们,在Excel里面改编码格式。
但是我们可以使用Python语言实现,改后缀名不乱码
import pandas as pd
df=pd.read_csv("xxx.csv", encoding="utf-8", sep=",") #读csv
df.to_excel("xxx.xslx") # 存Excel (默认有行列索引,可以通过参数消除,记得查看源代码)
"""
三、数据预处理
查看数据信息
import pandas as pd
df = pd.read_csv("xxx.csv", encoding="utf-8")
df.info() # 查看数据维度,列名称等数据的基础信息
print(df.shape) # 返回行列数,(行,列)
df.isnull() # 判断空值,空值为True,非空为False
print(df.columns) # 查看列索引名称
df.head() # 查看前五条数据
df.tail() # 查看后五条数据
print(df.describe()) # 基础统计信息
缺失值处理(数据清洗)
import pandas as pd
df = pd.read_csv("财务.csv", encoding="utf-8")
df.dropna() # 删除缺失值的行,确失一个数据就删除整行
df.dropna(how="all")
"""
* 'any' : If any NA values are present, drop that row or column.
* 'all' : If all values are NA, drop that row or column.
"""
df.fillna(0) # 将所有缺失值填充为0
df.fillna({"科目": "现金"}) # 将”科目“列缺失值填充为”现金“
# 多列填充时,使用多对键值对{"科目": "现金","金额":0}
数据重复值处理
import pandas as pd
df = pd.read_csv("财务.csv", encoding="utf-8")
df.drop_duplicates() # 对所有数值进行判断,保留重复的第一行
df.drop_duplicates(subset="科目") # 对科目列进行去重复值
df.drop_duplicates(subset=["科目", "票据号"]) # 多列去重复值
df.drop_duplicates(subset="科目", keep=False) # 把重复全部删除
"""
keep : {'first', 'last', ``False``}, default 'first'
Determines which duplicates (if any) to keep.
- 'first' : Drop duplicates except for the first occurrence.
- 'last' : Drop duplicates except for the last occurrence.
- ``False`` : Drop all duplicates.
"""
四、数据类型转换
查看某一列的数据类型
df["年龄"].dtype
数据类型转换
df["年龄"].dtype
df["年龄"].astype("float64")
五、数据的选择
1.列数据选择
df["科目"] # 选择科目列数据
df[["科目","票据号"]] # 选择多列数据
# 使用iloc函数选择列数据
df.iloc[:,[0,2]] # 选择第一列和第三列数据
2.行数据选择
选择一行数据
df.loc["7月8日"]
df.iloc[0] # 选择第一行数据
选择多行数据
df.loc["7月8日","7月15日"]
df.iloc[[0,2]] # 选择第一行和第三行数据
3.选择满足条件的行列数据(数据筛选)
选择满足一种条件的行数据
df[df["年龄"]>30]
选择满足多种条件的行数据
df[(df["年龄"]>30) & (df["年龄"]<60)]
4.按日期数据的筛选
#转换时间类型
from datetime import datetime
# datetime 的用法,可以查看源代码
df["日期"]=pd.to_datetime(df["日期"]) # 2023-8-5
df[df["注册日期"] == datetime(2023,8,5)]
df[df["注册日期"] >= datetime(2023,8,5)]
六、数值排序
按某列数值排序
df.sort_values(by=["编码"],ascending=False)
按索引进行行排列
df.sort_index()
按多列数据进行行排列
df.sort_values(by=["年龄","编号"],ascending=[False,True])
七、数据计数与唯一值选择
数值计数
df["年龄"].value_conuts()
唯一值获取
df["年龄"].unique()
八、数据运算
1.算术运算
df["一月金额"]+df["二月金额"]
df["一月金额"]+df["二月金额"]*2
2.比较运算
df["一月金额"]>df["二月金额"]
3.汇总运算
count计算非空值
df.count() # 对各列
df['年龄'].count() # 年龄列非空值
df.count(axis=1) # 求各行非空值
sum求和以及其他数值运算函数
df.sum() # 对各列求和
df["一月份金额"].sum() # 对某一列求和
df.sum(axis=1) 对各行进行求和
# 其他其他数值运算函数,参考sum方法
# mean ,求平均值
# max , 求最大值
# min , 求最小值
# median , 求中位数
# mode ,求众数
# var ,求方差
# std ,求标准差
# quantile , 求分位数,使用df.percentile(0.25),求各列1/4分位数
4.相关性运算
用来衡量两个事物之间的相关程度。如皮尔逊相关系数。
df.correl() # 求整个表两个字段两两之间的相关性
df['一月金额'].correl(df['二月金额'])
九、数据分组(汇总)
按一列进行分组并对所有列进行计数汇总
df.groupby("店名").count()
df.groupby("店名").sum() # 求和
按多列进行分组并对所有列进行求和
df.groupby(["店名","品种"]).sum() # 求和
按一列进行分组并对指定列进行求和
df.groupby("店名")["数量"].sum()
按一列进行分组并对所有列进行求和与计数
df.groupby("店名").aggregate(["count","sum"])
按一列进行分组并对多列进行不同求和与计数
df.groupby("店名").aggregate({"品种":"count","销售金额":"sum"})
十、数据拼接
1.merge()横向拼接
import pandas as pd
d1 = pd.DataFrame(pd.read_csv("2022年业绩.xlsx"))
d2 = pd.DataFrame(pd.read_csv("2023年业绩.xlsx"))
d3 = pd.DataFrame(pd.read_csv("2024年业绩.xlsx"))
d4 = pd.DataFrame(pd.read_csv("2025年业绩.xlsx"))
d5 = pd.DataFrame(pd.read_csv("2026年业绩.xlsx"))
pd.merge(d1, d2) # 公共列连接两个数据
pd.merge(d1, d3, on=["部门", "编号"]) # 指定键连接两个数据
pd.merge(d1, d4, left_on="部门", right_on="编号") # 两个表没有公共列,指定键连接两个数据
pd.merge(d1, d5, on="编号", how="inner") # 重复列名的处理
2.concat()纵向拼接
import pandas as pd
d1 = pd.DataFrame(pd.read_csv("2022年业绩.xlsx"))
d2 = pd.DataFrame(pd.read_csv("2023年业绩.xlsx"))
pd.concat([d1, d2]) # 类似俄罗斯方块,一个堆在另一个上面
3.append()纵向拼接
import pandas as pd
d1 = pd.DataFrame(pd.read_csv("2022年业绩.xlsx"))
d2 = pd.DataFrame(pd.read_csv("2023年业绩.xlsx"))
d3=d1.append(d2) # 类似俄罗斯方块,一个堆在另一个上面,像pd.concat([d1, d2]) 。