向文件中写入
- 效果
- 代码
import pandas as pd #需要向文件中写入的数据 df=pd.DataFrame({"ID":[1,2,3],"Name":['time','writer','top']}) #设置文档的索引 df=df.set_index("ID") #创建文件,同时将数据写入到文件中 df.to_excel("C:/Users/lenovo/Desktop/001.xlsx") print(df) print("Done!")
从文件中读取
- 效果
- 代码
import pandas as pd # 读取文件,,第二个参数 header=0,默认,从第 0 行开始读还可以设为None # 参数还可以是 index_col="ID" people=pd.read_excel("C:/Users/lenovo/Desktop/001.xlsx") # 打印表的行数,列数 print(people.shape) # 打印列名 print(people.columns) # 打印想要显示前几行数据 print(people.head(2)) print("================") # 打印想要显示倒数几行数据 print(people.tail(2))
两种形式存数据
字典形式
列表形式
代码
import pandas as pd
# 字典类型
d = {"x": 100, "y": 200, "z": 300}
# 转换类型
s1 = pd.Series(d)
print(s1)
# 第二种方法
L1 = [100, 200, 300]
L2 = ["y", "x", "z"]
s1 = pd.Series(L1, index=L2)
print(s1)
s1 = pd.Series([1, 2, 3], index=[1, 2, 3], name="A")
s2 = pd.Series([10, 20, 30], index=[1, 2, 3], name="B")
s3 = pd.Series([100, 200, 300], index=[1, 2, 3], name="C")
# 数据,下面这两种加入数据的操作就是:
# 以字典形式加入:就是列数据,name是列名,索引是行名
# 以列表形式加入:就是行数据,name是行名,索引是列名
# data_file=pd.DataFrame({s1.name:s1,s2.name:s2,s3.name:s3})
data_file = pd.DataFrame([s1, s2, s3])
# 存储数据
data_file.to_excel("C:/Users/lenovo/Desktop/001/003_2.xlsx")
print(data_file)
数据填充
-
效果
-
代码
import pandas as pd from datetime import date, timedelta # 加月的函数 def add_month(d, md): yd = md // 12 m = d.month + md % 12 if m != 12: yd += m // 12 m = m % 12 return date(d.year + yd, m, d.day) books = pd.read_excel("C:/Users/lenovo/Desktop/001/004.xlsx", skiprows=3, usecols="C:F", index_col=None, dtype={"ID": str, "Instore": str, "Date": str}) start = date(2018, 1, 1) for i in books.index: books["ID"].at[i] = i + 1 books["Instore"].at[i] = "Yes" if i % 2 == 0 else "No" # books["Date"].at[i]=date(start.year+i,start.month,start.day) books["Date"].at[i] = add_month(start, i) print(books) books.to_excel("C:/Users/lenovo/Desktop/001/004.xlsx")
柱状图
-
效果
-
原始数据
-
代码
import pandas as pd
import matplotlib.pyplot as plt
# 读入文件
students=pd.read_excel("C:/Users/lenovo/Desktop/001/Students.xlsx")
# 文件排序,inplace=True开始排序,默认从小到大,ascending=False则从大到小排序
students.sort_values(by="Number",inplace=True,ascending=False)
print(students)
# 设置柱状图的x,y每个格标注名称,以原数据进行标记图的名称,
students.plot.bar(x="Field",y="Number",color='r')
# 柱的颜色, 蓝色
plt.bar(students.Field,students.Number,color="#0000ff")
# x轴旋转90°
plt.xticks(students.Field,rotation='90')
# 设置柱状图的x,y轴端名称,图的名称
plt.xlabel("区域")
plt.ylabel("数量")
plt.title("myFirstView",fontsize=20)
plt.tight_layout()
# plt.box()
plt.show()
柱状图,多组数据对比
- 效果
- 原数据
- 代码
import pandas as pd
import matplotlib.pyplot as plt
# 读入文件
students=pd.read_excel("C:/Users/lenovo/Desktop/001/Students1.xlsx")
# 对数据排序
students.sort_values(by='2017',inplace=True,ascending=False)
students.plot.bar(x="Field",y=['2016','2017'],color=['r','k'])
plt.title("title",fontsize=16,fontweight='bold')
plt.xlabel("Field",fontweight='bold')
plt.ylabel("Number",fontweight='bold')
# x轴名字旋转
ax=plt.gca()
ax.set_xticklabels(students['Field'],rotation=45,ha='right')
# 调整图形位置
f=plt.gcf()
f.subplots_adjust(left=0.2,bottom=0.5) # 距左边 0.2,距底部 0.5
# 把表的数据全部显示出来
# plt.tight_layout()
plt.show()
叠加水平柱状图
- 效果
- 原数据
- 代码
"""和表,数据合在一起显示"""
import pandas as pd
import matplotlib.pyplot as plt
# 读入文件
users=pd.read_excel("C:/Users/lenovo/Desktop/001/Users.xlsx")
# 为了排列加一列数据
users["Total"]=users['Oct']+users['Nov']+users['Dec']
users.sort_values(by='Total',inplace=True,ascending=False)
# 水平排列
users.plot.barh(x='Name',y=['Oct','Nov','Dec'],stacked=True)
# plt.tight_layout()
plt.show()
饼状图
-
效果
-
原数据
-
代码
""""画饼图"""
import pandas as pd
import matplotlib.pyplot as plt
# 读入数据
students=pd.read_excel("C:/Users/lenovo/Desktop/001/Students2.xlsx",index_col="From")
# 顺时针排列,起始位置
students['2017'].plot.pie(fontsize=8,counterclock=False,startangle=-270)
plt.show()
折线趋势图
-
效果
-
原数据
-
代码
"""折线图"""
import pandas as pd
import matplotlib.pyplot as plt
weeks=pd.read_excel("C:\\Users\\lenovo\\Desktop\\001\\Orders.xlsx",index_col="Week")
# 绘制
weeks.plot(y=['Accessories','Bikes','Clothing','Components'])
# weeks.plot.area(y=['Accessories','Bikes','Clothing','Components'])
plt.xticks(weeks.index,fontsize=8)
plt.show()
散点图、直方图、密度图
- 效果
- 原数据
- 代码
import pandas as pd
import matplotlib.pyplot as plt
# 导入数据
homes=pd.read_excel("C:\\Users\\lenovo\\Desktop\\001\\home_data.xlsx")
# 显示所有列
pd.options.display.max_columns=777
# print(homes.head())
# 绘制散点图
# homes.plot.scatter(x="sqft_living",y='price')
# 绘制直方图
homes["sqft_living"].plot.hist(bins=100)
# 修饰直方图
plt.xticks(range(0,max(homes.sqft_living),500),fontsize=8,rotation=90)
# 绘制密度图
# homes['sqft_living'].plot.kde()
# plt.xticks(range(0,max(homes.sqft_living),500),fontsize=8,rotation=90)
plt.show()
多表合并
- 效果
- 原数据
- 代码
# 学生成绩数据分析
import pandas as pd
# 读入数据
students=pd.read_excel("C:\\Users\\lenovo\\Desktop\\001\\Student_Score.xlsx",sheet_name="Students")
scores=pd.read_excel("C:\\Users\\lenovo\\Desktop\\001\\Student_Score.xlsx",sheet_name="Scores")
# 合并表格
table=students.merge(scores,how="left",on="ID").fillna(0)
table["Score"]=table["Score"].astype(int)
print(table)
数据校验、筛选错误数据
- 效果
- 原数据
- 代码
# 筛选错误数据
import pandas as pd
students=pd.read_excel("C:\\Users\\lenovo\\Desktop\\001\\Students3.xlsx")
# 校验分数
def score_validation(row):
"""第一种方式,抛异常"""
# try:
# assert 0<=row.Score<=100
# except:
# print(f"#{row.ID} student{row.Name}has an invalid score{row.Score}.")
""""第二种方法,if语句"""
if not 0<=row.Score<=100:
print(f"#{row.ID}\t student{row.Name}has an invalid score{row.Score}.")
students.apply(score_validation,axis=1)
18拆分一列数据
- 效果
- 原数据
- 代码
import pandas as pd
# 拆分列 split(根据什么分割,expand=True(分割成列),保留几个数据)
employees=pd.read_excel("C:\\Users\\lenovo\\Desktop\\001\\Employees.xlsx",index_col="ID")
df=employees["Full Name"].str.split(' ',expand=True,n=1)
employees["First Name"]=df[0].str.upper()
# employees["Last Name"]=df[1]
print(employees)