使用Python对xlsx,csv, txt格式文件进行读、写并绘图
最近需要用到python通过读取,写入Excel数据,并画一些图。虽然以前学过一些,但是都忘得差不多了,故翻出以前学习的资料,整理在此,常用常新,也方便自己以后复习。
0. 背景
最近需要用到python通过读取,写入Excel数据,并画一些图。虽然以前学过一些,但是都忘得差不多了,故翻出以前学习的资料,整理在此,常用常新,也方便自己以后复习。
1. 通过pandas库在Python里写入数据到Excel,并生成本地文件(001)
代码:
import pandas as pd #导入pandas模块,将pandas简写为pd
df = pd.DataFrame({'ID':(1,2,3),'Name':('Tim','Victor','Nick')}) #生成两列,一列是ID,一列是Name
df = df.set_index('ID') #用ID这列来替代默认的index
df.to_excel('D:/py学习/Python_EXCEL/output.xlsx') #生成一个excel文件
print('Done!')
输出样式:
2. 通过pandas库读取本地Excel文件,并直接在Python里显示(002)
代码:
import pandas as pd
Incites = pd.read_excel('D:/py学习/Python_EXCEL/Incites.xlsx')
print(Incites.shape) # 显示有表格中有(几行,几列)
print(Incites.columns) # 输出表头,也就是第一行
print(Incites.head(3)) # 输出前三行
print('========================')
print(Incites.tail(3)) #输出后三行
输出样式:
3. 通过pandas库在Python里写多行多列数据的格式(不生成本地文件)(003)
代码:
import pandas as pd
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 = [2,3,4],name = 'C')
df = pd.DataFrame({s1.name:s1,s2.name:s2,s3.name:s3}) # 将A,B,C按列来写入
# df = pd.DataFrame([s1,s2,s3]) # 将A,B,C按行来写入
print(df)
输出样式:
![![![在这里插入图片描述](https://img-blog.csdnimg.cn/f1544c2b30e0473da830251a4444a7cb.png#pic_center)
4. 通过pandas将本地Excel中的数据排序,分类,并直接在Python里显示(007)
代码:
import pandas as pd
products = pd.read_excel('D:/py学习/Python_EXCEL/List.xlsx', index_col='ID')
# products.sort_values(by='Price',inplace=True,ascending=False) #inplace=True意思为不创建新的对象,直接对原始对象进行修改;\
# ascending=False将Price这一列从高到低排序,将False改为True则变为从低到高排序
products.sort_values(by=['Worthy', 'Price'], inplace=True, ascending=[True, False]) # 分成两列进行操作,先将Worthy分为No在上,YES在下;再将No的Price从高到底排列,Yes的Price也从高到底排列
print(products)
输出样式:
5. 通过pandas库在Python实现对本地Excel中数值大小范围的筛选,将直接在Python里显示(不保存到原Excel文件)(008)
初始数据:
对学生的Age(18-30)和分数(85-100)两个参数进行筛选。
代码:
import pandas as pd
# 年龄筛选函数
def age_18_to_30(a):
return a>=18 and a<=30 # 或者写为18<=a<=30,这是Python特有的写法
# 得分筛选函数
def level_a(s):
return s>=85 and s<=100 # 或者写为85<=s<=100,这是Python特有的写法
students = pd.read_excel('D:/py学习/Python_EXCEL/Students.xlsx', index_col='ID')
# students = students.loc[students['Age'].apply(age_18_to_30)] # 用loc获取Age元素,再apply(调用)年龄筛选函数
# students = students.loc[students.Age.apply(age_18_to_30)] # 上一行的用loc获取Age元素也可以写成这样,这是Python特有的写法
students = students.loc[students['Age'].apply(age_18_to_30)].loc[students['Score'].apply(level_a)] # 在上一句基础上再用loc获取Score元素,再apply(调用)得分筛选函数
# students = students.loc[students['Age'].apply(lambda a: 18<=a<=30)].loc[students['Score'].apply(lambda s: 85<=s<=100)] #也可以用lambda,删掉两个def和上一行,只用这一行就能实现
print(students)
输出样式:
6. 通过pandas库读取本地Excel文件,并通过matplotlib在Python里画出柱形图(bar_chart)(009)
原数据:
将该数据画成直方图
代码:
import pandas as pd
import matplotlib.pyplot as plt # 导入画柱状图模块;将matplotlib简写为plt
students = pd.read_excel('D:/py学习/Python_EXCEL/Res_areas.xlsx')
students.sort_values(by='Documents_number', inplace=True, ascending=False) # 将Documents_number从高到低排序
print(students)
# students.plot.bar(x='Name',y='Documents_number',color='orange') #(这是用的pandas绘图),plot.bar为条(柱)状图意思;给x,y对应的head;如果不定义颜色,则默认为蓝色
plt.bar(students.Name, students.Documents_number, color='orange') #(这是用的matplotlib绘图);给x,y对应的head;如果不定义颜色,则默认为蓝色
plt.xticks(students.Name, rotation='90') # 将x轴旋转90度,不然全连成一排密密麻麻看不清楚
plt.xlabel('Name') # 给x轴命名
plt.ylabel('Documents_number') # 给y轴命名
plt.title('Wos of Science Res_areas') # 给该柱状图命名
plt.tight_layout() # 设置为紧凑型布局,不然x轴head显示不全
plt.show() # 出图
输出样式:
7. 通过pandas库读取本地Excel文件,并通过matplotlib在Python里画出双柱形图(double_bar_chart)(010)
原数据:
将该数据画成双柱形图
代码:
import pandas as pd
import matplotlib.pyplot as plt
students = pd.read_excel('D:/py学习/Python_EXCEL/Res_areas_double.xlsx')
students.sort_values(by='2021', inplace=True, ascending=False) #按2021列从高到低排序
print(students)
students.plot.bar(x='Res_areas', y=['2020', '2021'], color=['orange','r' ]) # 用列表来定义两个y元素和两种颜色,excel中的head和x和y不能是纯数字,会找不到报错,得在EXCEL的head中的数字前面加';也不能有中文,图里显示不出来
plt.title('Wos of Science Res_areas',fontsize=16,fontweight='bold') # 给该柱状图命名;规定字号16;粗体
plt.xlabel('Res_areas', fontweight='bold')
plt.ylabel('Documents_number', fontweight='bold')
ax = plt.gca() # gca=get current axis,获取当前坐标轴
ax.set_xticklabels(students['Res_areas'], rotation='45', ha='right') # 将x轴的ticklabels旋转45度;ha=horizontal alignment,以右边为中心点水平对齐;会自带xlabel,但不能像第9行那样显示字体字号
f = plt.gcf() # gca=get current figure,获取当前图形,指figure黑色框里的部分
f.subplots_adjust(left=0.2,bottom=0.45) # 左边留出20%空白,底部留出42%空白
# plt.tight_layout() # 设置为紧凑型布局,不然x轴head显示不全,这是比较笼统的布局,上两行是精确布局,两种方法不同时使用
plt.show()
输出样式:
8. 通过pandas库读取本地Excel文件,并通过matplotlib在Python里画出堆叠柱形图(stacked_chart)(011)
原数据:
将该数据画成堆叠柱形图
代码:
import pandas as pd
import matplotlib.pyplot as plt
users = pd.read_excel('D:/py学习/Python_EXCEL/Users.xlsx')
users['Total'] = users['Oct'] + users['Nov'] + users['Dec'] # 新增一列Total
users.sort_values(by='Total', inplace=True, ascending=True) # ascending为离0点越近的越大
print(users)
users.plot.barh(x='Name', y=['Oct', 'Nov', 'Dec'], stacked=True, title='User Behavior') # 在bar后面加个h表示横向显示;用stacked将三条柱状图堆叠起来;给定title
#plt.title('User Behavior', fontsize=16, fontweight='bold') #给定title,也可以像上一行一样,但是上一行不能自定义title字号字体
plt.tight_layout()
plt.show()
输出样式:
9. 通过pandas库读取本地Excel文件,并通过matplotlib在Python里画出饼图(piechart)(012)
原数据:
将该数据画成饼图
代码:
import pandas as pd
import matplotlib.pyplot as plt
papers = pd.read_excel('D:/py学习/Python_EXCEL/papers.xlsx', index_col='国家/地区') # 不用index指定饼图的每一块表示什么的话它就默认用index来显示了
print(papers)
papers['2020'].plot.pie(fontsize=8, counterclock=False, startangle=-270) # 用couterclock顺时针排序,,起点为-270度,也可用下行所示,但是麻烦了
# papers['2020'].sort_values(ascending=True).plot.pie(fontsize=8, startangle=-270) # 顺时针排序,之前的是bar,生成的条形图,这次是pie,生成饼状图,起点为-270度
plt.title('Source of Web of Science Papers', fontsize=16, fontweight='bold')
plt.ylabel('2020', fontsize=12, fontweight='bold')
plt.show()
输出样式:
10. 通过pandas库读取本地Excel文件,并通过matplotlib在Python里画出堆积图(stacked_area_chart)(013)
原数据:
10.1 将该数据画成堆积图
代码:
import pandas as pd
import matplotlib.pyplot as plt
years = pd.read_excel('D:/py学习/Python_EXCEL/Years.xlsx', index_col='Year')
print(years)
print(years.columns) # 打印表头
years.plot.area(y=['USA', 'China', 'UK']) # plot后不加.area就默认是折线图了;plot后加一个.area就是叠加区域图
# years.plot.barh(y=['USA', 'China', 'UK'], stacked=True)
plt.title('Source of Country', fontsize=16, fontweight='bold')
plt.ylabel('Number of Papers', fontsize=12, fontweight='bold')
plt.xticks(years.index, fontsize=8, rotation='45', ha='right')
plt.show()
输出样式:
10.1 将该数据画成折线图(区别只在代码第8行plot少了.area)
代码:
import pandas as pd
import matplotlib.pyplot as plt
years = pd.read_excel('D:/py学习/Python_EXCEL/Years.xlsx', index_col='Year')
print(years)
print(years.columns) # 打印表头
years.plot.area(y=['USA', 'China', 'UK']) # plot后不加.area就默认是折线图了;plot后加一个.area就是叠加区域图
# years.plot.barh(y=['USA', 'China', 'UK'], stacked=True)
plt.title('Source of Country', fontsize=16, fontweight='bold')
plt.ylabel('Number of Papers', fontsize=12, fontweight='bold')
plt.xticks(years.index, fontsize=8, rotation='45', ha='right')
plt.show()
输出样式:
11. 通过pandas库读取本地Excel文件,并通过matplotlib在Python里画出散点图(Bar_chart)(011)
原数据:
将该数据第二三列前五行画成散点图
代码:
import pandas as pd
import matplotlib.pyplot as plt
pd.options.display.max_columns = 777 # 设置最大显示777列,这样打印的列就不会被省略号显示不全了
names = pd.read_excel('C:/Users/WJ/Desktop/Python_EXCEL/Names.xlsx')
print(names.head()) # 默认打印表头和前5行
names.plot.scatter(x='Documents', y='Times_cited') # 画散点图
plt.show()
输出样式:
12. 通过pandas库读取本地Excel文件,并通过matplotlib在Python里画出直方图(Histogram)(015)
注:关于直方图和柱形图的差别如下:
直方图一般用来描述等距数据或等比数据;柱形图一般用来描述称名数据或顺序数据。. 直观上,直方图矩形之间是衔接在一起的,表示数据间的数学关系;柱形图则留有空隙,表示仅作为两个或多个不同的类,而不具有数学相关性质。
原数据:
将该数据第二三列前五行画成直方图
代码:
import pandas as pd
import matplotlib.pyplot as plt
pd.options.display.max_columns = 777 # 设置最大显示777列,这样打印的列就不会被省略号显示不全了
names = pd.read_excel('D:/py学习/Python_EXCEL/Names.xlsx')
print(names.head()) # 默认打印表头和前5行
names.Times_cited.plot.hist(bins=100) # hist=histogram,画直方图;用bins细化100个区间,当样本量足够大时图像曲线看起来更平滑
plt.xticks(range(0, max(names.Times_cited), 500), fontsize=8, rotation=90) # 生成x轴刻度,获取Time_cited从0到最大值,再除以500=分度值
print(names.corr()) # 用corr打印各行之间的相关系数,corr=correlation
plt.tight_layout()
plt.show()
输出样式:
13. 通过pandas库读取本地Excel文件,并在Python将其转置输出(021)
原数据:
将该数据第二三列前五行画成散点图
代码:
import pandas as pd
pd.options.display.max_columns=999 # 每行最大显示单元格为999,这样就不会被折叠了
videos = pd.read_excel('D:/py学习/Python_EXCEL/Videos.xlsx', index_col='Month')
table = videos.transpose()
print(table)
输出样式:
14. 通过pandas库读取本地csv格式文件,并在Python将其输出(022)
原数据:
代码:
import pandas as pd
pd.options.display.max_columns=999 # 每行最大显示单元格为999,这样就不会被折叠了
students1 = pd.read_csv('D:/py学习/Python_EXCEL/Incites_Pulication.csv') # 用read_csv读取csv文件
print(students1)
输出样式:
15. 通过pandas库读取本地csv格式文件,并在Python将其输出(022)
原数据:
代码:
import pandas as pd
pd.options.display.max_columns=999 # 每行最大显示单元格为999,这样就不会被折叠了
students2 = pd.read_csv('D:/py学习/Python_EXCEL/info.txt') # 读取TXT文件还是用read_csv
print(students2)
输出样式:
15. 通过pandas库读取本地csv格式文件,再通过scipy库对数据进行线性回归分析,并用matplotlib在Python将其输出(022)
原数据:
代码:
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import linregress # 导入scipy线性回归包
num = pd.read_excel('D:/py学习/Python_EXCEL/Trendency.xlsx')
print(num)
slope, intercept, r, p, std_err=linregress(num.Year, num.USA) # 关键点,调用这个scipy里的linregress函数可以直接得到slope斜率;intercept截距
exp = num.Year*slope+intercept # exp=exception,期望
plt.scatter(num.Year, num.USA) # 画散点图
plt.plot(num.Year, exp, color='orange') #画线图
plt.title(f"y={slope}*x+{intercept}")
plt.xticks(num.Year, rotation=90) # 设置x轴坐标参数刻度线
plt.tight_layout()
plt.show()
print(slope*35+intercept)
输出样式:
更多推荐
所有评论(0)