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!')

输出样式:
![在这里插入图片描述](https://img-blog.csdnimg.cn/e70d99f1d60541b6957f62d15e64d478.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-

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))       #输出后三行

输出样式:
![![在这里插入图片描述](https://img-blog.csdnimg.cn/e70d99f1d60541b6957f62d15e64d478.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-](https://img-

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)

输出样式:
在这里插入图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐