提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
提示:这里可以添加本文要记录的大概内容:
一、pandas是什么?
pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
二、使用步骤
1.引入库
代码如下(示例):
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
import ssl
2.读入数据
代码如下(示例):
data = pd.read_csv(
'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())
该处使用的url网络请求的数据。
3.读取数据
import pandas as pd
classes = pd.read_excel('D:/DateExercise/wl2231.xlsx')
print(classes.shape) #显示出多少行多少列(41, 3)
print(classes.columns)#打印出列 Index(['学号', '姓名', 'pu总分'], dtype='object')
print(classes.head())#head()不写参数默认打印前五行
print("========================================")
print(classes.tail(3)) #打印后3行数据
提示:读取错误数据,有脏header时:第一行不是想要的特征
import pandas as pd
classes = pd.read_excel('D:/DateExercise/wlcuowei.xlsx',header=1)
print(classes.columns)
提示:读取数据若head错位,即学号,姓名等上一行为空的,不用加header=1也可识别正确特征
提示:读取数据无header的处理方法
import pandas as pd
classes = pd.read_excel('D:/DateExercise/wl2231noheader.xlsx',header=None)#header=None后,打印结果为Index([0, 1], dtype='int64')
classes.columns=['学号','姓名'] #自己添加
print(classes.columns) #打印结果为Index(['学号', '姓名'], dtype='object')
classes.to_excel('D:/DateExercise/output.xlsx')
print('Done')
提示:读取数据时为避免输出数据重复索引,一般会标明索引
import pandas as pd
classes=pd.read_excel('D:/DateExercise/output1.xlsx',index_col='ID') #索引为ID
classes.to_excel('D:/DateExercise/output2.xlsx')
print('Done')
三、具体用法
1.新建DataFrame
代码如下(示例):
import pandas as pd
df = pd.DataFrame({'ID':[1,2,3],'Name':['sun','tom','sunny']})
print(df)
#结果是
ID Name
0 1 sun
1 2 tom
2 3 sunny
提示:把ID设置为新索引:
代码如下(示例):
import pandas as pd
#df = pd.DataFrame()
df = pd.DataFrame({'ID':[1,2,3],'Name':['sun','tom','sunny']})
df = df.set_index('ID')
print(df)
#结果是 ID成了新的索引
Name
ID
1 sun
2 tom
3 sunny
2.创建serises
import pandas as pd
# 方法一:用字典转换
# d={'x':100,'y':200,'z':300}
# s1=pd.Series(d) #把字典的key转为series的index,字典的value转为data
# print(s1)
# print(s1.index)
L1 = [100,200,300]
L2 = ['X','Y','Z']
s1 = pd.Series(L1,index=L2)
print(s1)
#结果是
X 100
Y 200
Z 300
dtype: int64
3.用serises模拟表格
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=[1,2,3],name='C')
df = pd.DataFrame({s1.name:s1,s2.name:s2,s3.name:s3})#以dataframe方式加入
print(df)
#结果是
# A B C
# 1 1 10 100
# 2 2 20 200
# 3 3 30 300
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=[1,2,3],name='C')
df = pd.DataFrame([s1,s2,s3]) #用list方法是把每个序列看作一行
print(df)
#结果是
# 1 2 3
# A 1 2 3
# B 10 20 30
# C 100 200 300
4.serises实现自动填充
源数据
import pandas as pd
#from datetime import data,timedelta
from datetime import date
from datetime import timedelta
def add_month(d,md):
yd = md // 12 # 计算需要添加的年数
m = d.month + md % 12 # 计算新的月份
if m != 12:
yd += m //12 # 将新的月份除以12的商加到年数上
m = m % 12
return date(d.year+yd,m,d.day)
'''
d:这是一个日期对象(来自Python的datetime模块),代表您想要添加月份的日期。
md:这是一个整数,表示您想要添加到日期d的月份数量。
'''
books = pd.read_excel('D:/DateExercise/books.xlsx',skiprows=3,usecols='C:F',index_col=None,dtype={'ID':str,'InStore':str,'Date':str})#原本是float,把NaN转换int会报错
print(type(books['ID'])) #<class 'pandas.core.series.Series'>
# books['ID'].at[0]=100
# print(books['ID'])
start = date(2023,12,6)
for i in books.index :
books['ID'].at[i] = i+1
# books.at[i,'ID'] = i+1
books['InStore'].at[i] = 'Yes' if i % 2 == 0 else 'No'
# books['Date'].at[i] = start + timedelta(days=i) #加日期
#books['Date'].at[i] = date(start.year + i,start.month,start.day)
books['Date'].at[i] = add_month(start,i)
print(books)
5.函数填充计算列
要求:把ListPrice价钱加2,然后计算Price,自动填充部分价格
import pandas as pd
def add_2(x):
return x+2
books=pd.read_excel('D:/DateExercise/book1.xlsx',index_col='ID')
#books['ListPrice']=books['ListPrice']+2 #把价格+2
#books['ListPrice']=books['ListPrice'].apply(lambda x:x+2)
books['ListPrice']=books['ListPrice'].apply(add_2)
# books['Price']=books['ListPrice']*books['Discount']
'''
for i in books.index:
books['Price'].at[i] = books['ListPrice'].at[i]*books['Discount'].at[i]
'''
for i in range(5,16):
books['Price'].at[i] = books['ListPrice'].at[i]*books['Discount'].at[i]
print(books)
6.pandas实现排序
源数据如下:
要求:保持价值高的情况下,价格从高到低降序排列
import pandas as pd
products=pd.read_excel('D:/DateExercise/paixu.xlsx',index_col='ID')
products.sort_values(by=['Worthy','Price'],inplace=True,ascending=[False,False]) #ascending=False是从高到低排序
print(products)
7.pandas实现过滤筛选
源数据如下:
要求:找出年龄在18-30岁,成绩在85-100的学生
import pandas as pd
'''def age_18_to_30(a):
return 18 <= a < 30
def level_a(s):
return 85 <= s <= 100
'''
infromation=pd.read_excel('D:/DateExercise/information.xlsx',index_col='ID')
#infromation=infromation.loc[infromation.Age.apply(age_18_to_30)].loc[infromation.Score.apply(level_a)]
#infromation=infromation.loc[infromation['Age'].apply(age_18_to_30)].loc[infromation['Score'].apply(level_a)]
infromation=infromation.loc[infromation.Age.apply(lambda a:18 <= a < 30)] \
.loc[infromation.Score.apply(lambda s:85 <= s <= 100)]
print(infromation)
8.pandas实现柱状图从高到低
import pandas as pd
import matplotlib.pyplot as plt
students=pd.read_excel('D:/DateExercise/students.xlsx')
students.sort_values(by='Number',inplace=True,ascending=False)
print(students)
#students.plot.bar(x='Field',y='Number',color='orange',title='International Students by Field')
#用matplotlib来绘图
plt.bar(students.Field,students.Number,color='orange')
plt.xticks(students.Field,rotation=90) #将Field反转展开
plt.xlabel('Field') #X轴标签
plt.ylabel('Number') #y轴标签
plt.title('International Students by Field')
plt.tight_layout()#紧凑型
plt.show()
9.pandas实现柱状图比较
import pandas as pd
import matplotlib.pyplot as plt
students = pd.read_excel('D:/DateExercise/studentsyouhua.xlsx')
students.sort_values(by=2023,inplace=True,ascending=False)#inplace=True不会生成新的DataFrame,ascending=False从大到小排序
print(students)
students.plot.bar(x='Field',y=[2022,2023],color=['orange','red'])
plt.title('International Students by Field',fontsize=16,fontweight='bold')
plt.xlabel('Field',fontweight='bold')
plt.ylabel('Number',fontweight='bold')
#标签倾斜45度
ax = plt.gca()
ax.set_xticklabels(students['Field'],rotation=45,ha='right')
#左边留白,下面留白
f=plt.gcf()
f.subplots_adjust(left=0.2,bottom=0.62)
#plt.tight_layout() #将标签完全展示出来
plt.show()
10.pandas实现叠加柱状图
要求:把用户每月使用量累加进行排序
import pandas as pd
import matplotlib.pyplot as plt
users = pd.read_excel('D:/DateExercise/users.xlsx')
users['Total']=users['Oct']+users['Nov']+users['Dec']
users.sort_values(by='Total',inplace=True,ascending=True)
print(users)
#barh是横向排列
users.plot.barh(x='Name',y=['Oct','Nov','Dec'],stacked=True,title='User Behavior')#stacked=True是把Oct,Nov,Dec累加起来
plt.tight_layout()
plt.show()
11.pandas实现饼图
饼状图实现,不仅反映数量还反映占百分比。
提示:2016旁边的',这个‘是用来表示字符串,为防止在pandas里被当作数值
import pandas as pd
import matplotlib.pyplot as plt
'''
1、导入相关库,读取数据
2、找一个serise画饼图
3、优化饼图(字体,标题)
4、pandas的饼图是逆时针比例,excel是顺时针
'''
#index_col='From'绘制出来的图才是国家地区名字
granduaters = pd.read_excel('D:/DateExercise/granduaters.xlsx',index_col='From')
print(granduaters)
#counterclock=False顺时针 [counterclock=False,startangle=-270]没有变化????
granduaters['2017'].plot.pie(fontsize=0,counterclock=False,startangle=-270)
plt.title('Source of International Students')
plt.ylabel('2017',fontsize=12,fontweight='bold')
granduaters['2017'].plot.pie()
plt.show()
12.pandas实现折线图和叠加区域图
折线图是看趋势,往往是时间趋势。叠加区域图,除了能看到趋势外,还能看到在某个点上所有值叠加起来的效果
叠加柱状图着重表达在某一个点上这些值叠加起来是什么值,叠加折线图是一个趋势,在某个阶段是上升还是下降
提示:选中一个单元格,Ctrl+G选择数据定位即可选中所有单元格
import pandas as pd
import matplotlib.pyplot as plt
weeks=pd.read_excel('D:/DateExercise/weeks.xlsx',index_col='Week')
print(weeks)
print(weeks.columns)
#折线图
#weeks.plot(y=['Accessories','Bikes','Clothing','Components'])
#叠加区域图
#weeks.plot.area(y=['Accessories','Bikes','Clothing','Components'])
#叠加柱状图
weeks.plot.bar(y=['Accessories','Bikes','Clothing','Components'],stacked=True)
plt.title('Sates Weekly Trend',fontsize=16,fontweight='bold')
plt.ylabel('Total',fontsize=12,fontweight='bold')
plt.xticks(weeks.index,fontsize=8)#本间隔太大,把横轴重铺一遍
plt.show()
13.pandas实现散点图
import pandas as pd
import matplotlib.pyplot as plt
house = pd.read_csv('D:/DateExercise/train_data.csv')
#把所有列都展示出来
pd.options.display.max_columns=777
house.plot.scatter(y='民宿评分',x='价格')
plt.show()
print(house.head())
14.pandas实现直方图
import pandas as pd
import matplotlib.pyplot as plt
house = pd.read_csv('D:/DateExercise/train_data.csv')
#把所有列都展示出来
pd.options.display.max_columns=777
house.plot.hist(y='价格',bins=100) #bins用于细化
plt.show()