Pandas学习(一)

本文详细介绍了pandas库在Python中的使用,包括数据导入、DataFrame和Series操作、数据清洗、排序、筛选、图表制作(如柱状图、饼图、折线图等)以及直方图和密度图。通过实例展示了如何使用pandas进行数据分析和可视化。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


提示:这里可以添加本文要记录的大概内容:


一、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()

15.pandas实现密度图

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值