1、表格数据的操作:【增删改查】
2、实现多个表格的处理
3、数据清洗操作:异常值、缺失值、重复值、数据标准化、数据转化的操作
4、实现excel的特殊操作:生成透视表、交叉表
5、完成统计分析
import pandas as pd
import numpy as np
dataframe一定是二维的
df=pd.DataFrame(data=[['ss',20,'男','0831'],['lx',18,'女','0830'],['lx',22,'女','0830']],
index=['a','c','b'],
columns=['name','age','gender','class'])
print(df)
name age gender class
a ss 20 男 0831
c lx 18 女 0830
b lx 22 女 0830
创建方法二:
df2=pd.DataFrame(data={
'name':['ss','lx'],
'age':[20,18],
'sex':['男','女'],
'class':['0831','0830']})
print(df2)
name age sex class
0 ss 20 男 0831
1 lx 18 女 0830
print('df的结构:',df.shape)
print('df的维度:',df.ndim)
print('df的元素个数:',df.size)
print('df的数据类型:\n',df.dtypes)
print('df的列索引:',df.columns)
print('df的行索引:',df.index)
print('df的元素:',df.values)
df的结构: (3, 4)
df的维度: 2
df的元素个数: 12
df的数据类型:
name object
age int64
gender object
class object
dtype: object
df的列索引: Index(['name', 'age', 'gender', 'class'], dtype='object')
df的行索引: Index(['a', 'c', 'b'], dtype='object')
df的元素: [['ss' 20 '男' '0831']
['lx' 18 '女' '0830']
['lx' 22 '女' '0830']]
三、dataframe的查找
series是一维的类型,只有一个轴,只能取一列
1、切一列值的方法
# 一维的切法,返回的是series类型
ser=df['name']
# print(type(ser)) #
print(ser)
a ss
c lx
b lx
Name: name, dtype: object
2、切多列值的方法
df[['name','age']]
name | age | |
---|---|---|
a | ss | 20 |
c | lx | 18 |
b | lx | 22 |
3、索引:df.loc[行索引名称/条件,列的索引名称]
df[['name','age']][:2] # 索引不能用负数切,当自己知道是第几行可以这么切
name | age | |
---|---|---|
a | ss | 20 |
c | lx | 18 |
df.loc['a','name']
'ss'
df.loc['a',:] # 一维的series类型
name ss
age 20
gender 男
class 0831
Name: a, dtype: object
# 只有当行和列传的索引数量都大于1才是二维的
df.loc[['a','b'],['name','age']]
name | age | |
---|---|---|
a | ss | 20 |
b | lx | 22 |
# 左闭右闭 b是名称,但是如果有两个b,那么就不能用:'b'来切
print(df.loc[:'b','name'])
a ss
c lx
b lx
Name: name, dtype: object
4、条件切片
获取所有年龄大于18的同学
mask=df['age']>18
print(mask)
a True
c False
b True
Name: age, dtype: bool
df.loc[mask,'name']
a ss
b lx
Name: name, dtype: object
# mask1=df['name']=='lx'
# print(mask1)
# mask2=df['age']>18
# print(mask2)
# mask3=mask1&mask2
# print(mask3)
df.iloc[行的位置索引,列的位置索引]
这个传的就是平时的索引了,前闭后开
print(df)
name age gender class
a ss 20 男 0831
c lx 18 女 0830
b lx 22 女 0830
df.iloc[:,1]
a 20
c 18
b 22
Name: age, dtype: int64
df.iloc[:2,2:]
gender | class | |
---|---|---|
a | 男 | 0831 |
c | 女 | 0830 |
df.iloc[-1,:]
name lx
age 22
gender 女
class 0830
Name: b, dtype: object
df.iloc[-1,:].index
Index(['name', 'age', 'gender', 'class'], dtype='object')
5、dataframe增加方法
(1)增加一列
df['address']=['北京','上海','广州']
print(df)
name age gender class address
a ss 20 男 0831 北京
c lx 18 女 0830 上海
b lx 22 女 0830 广州
df['address']='北京'
print(df)
name age gender class address
a ss 20 男 0831 北京
c lx 18 女 0830 北京
b lx 22 女 0830 北京
(2)增加一行
df_mini=pd.DataFrame(data={
'name':['ss','lx'],
'age':[20,18],
'gender':['男','女'],
'class':['0831','0830']},
index=['a','b'])
df3=df.append(df_mini,ignore_index=True)
# ignore_index:表示忽略原始索引,重新设置索引
print(df3)
name age gender class address
0 ss 20 男 0831 北京
1 lx 18 女 0830 北京
2 lx 22 女 0830 北京
3 ss 20 男 0831 NaN
4 lx 18 女 0830 NaN
6、删除方法
drop没有修改原表数据,有返回值,
但是里面的inplace=True参数会修改原表,修改后没有返回值
删完之后宽度变窄了,所以是沿着axis=1的方向操作
df3.drop(labels=['address','class'],axis=1)
df3.drop(labels=[0,1,2],axis=0,inplace=True)
print(df3)
name age gender class address
3 ss 20 男 0831 NaN
4 lx 18 女 0830 NaN
7、dataframe更改数值的方法
print(df)
name age gender class address
a ss 20 男 0831 北京
c lx 18 女 0830 北京
b lx 22 女 0830 北京
# 例:将名字为‘lx’的人的班级改为‘有问题’
df.loc[df['name']=='lx','class']='有问题'
print(df)
name age gender class address
a ss 20 男 0831 北京
c lx 18 女 有问题 北京
b lx 22 女 有问题 北京
1、沿用numpy中的统计方法:
print(df)
name age gender class address
a ss 20 男 0831 北京
c lx 18 女 有问题 北京
b lx 22 女 有问题 北京
np.mean(df['age'])
20.0
np.sum(df['age'])
60
print('最小值',df['age'].min())
print('标准差',df['age'].std())
print('最大值索引',df['age'],argmax())
最小值 18
标准差 2.0
# 其他方法:
# 极差:max-min
np.ptp(df['age'])
4
2、pandas方法
(1)针对series类型
df4=df.append(df_mini,ignore_index=True)
# 众数
df4['age'].mode()
0 18
1 20
dtype: int64
# 非空数目
df4['name'].count()
5
# 频数统计
df4['name'].value_counts()
lx 3
ss 2
Name: name, dtype: int64
(2) 针对df类型
最大值、最小值、标准差、方差、众数、非空数目。。。都是在一维和二维中通用的
value_counts()频数统计仅在一维中有
argmax()仅在一维中有
idxmax()一维二维都可以使用
df4.min()
name lx
age 18
gender 女
class 0830
dtype: object
df4['grade']=[100,98,58,85,77]
# 最大值索引,axis=1,横向比较
# axis=0,纵向比较
print(df4[['age','grade']].idxmax(axis=1))
print(df4[['age','grade']].idxmax(axis=0))
0 grade
1 grade
2 grade
3 grade
4 grade
dtype: object
age 2
grade 0
dtype: int64
总结:
一、series中的dataframe中通用的方法:
df.min()
df.max()
df.mean()
df.mode()众数
df.std()
df.var()
df.idxmax(axis=0)
df.idxmin(axis=0)
df.count()非空数目
二、只用series中存在的方法;
ser.value_counts()频数统计方法
三、df.describe()
'''
describe()作用在类别性df中返回值:
count:非空数目
unique:去重之后有几个值
top:众数
freq:众数出现的频数
'''
print(df4[['name','gender']].describe())
name gender
count 5 5
unique 2 2
top lx 女
freq 3 3
# 都是数值型
print(df4[['age','grade']].describe())
age grade
count 5.00000 5.000000
mean 19.60000 83.600000
std 1.67332 17.155174
min 18.00000 58.000000
25% 18.00000 77.000000
50% 20.00000 85.000000
75% 20.00000 98.000000
max 22.00000 100.000000
# 当数值型和类别型放在一起 会过滤类别型
print(df[['age','name']].describe())
age
count 3.0
mean 20.0
std 2.0
min 18.0
25% 19.0
50% 20.0
75% 21.0
max 22.0
print(pd.DataFrame(data={
'num':[1,2,4,5,5.5,6,7,8,8.5,10]}).describe())
num
count 10.000000
mean 5.700000
std 2.840188
min 1.000000
25% 4.250000
50% 5.750000
75% 7.750000
max 10.000000
# pd.read_excel(r'路径')
补充内容
1、series构建
pd.Series(data=['lx','ss','zs'],index=[0,1,2])
0 lx
1 ss
2 zs
dtype: object
sheet_name:切换sheet表格
1、 可以传入int,表示从0开始的索引
2、可以传入表名称
3、 可以传入None,表示一次性获取所有表格
4、 可以传入list,[‘sheetname’,2]这种混合的
data=pd.read_excel(r'D:\study\student\jupyter\meal_order_detail.xlsx',sheet_name=None)
# print(data)
print('查看当前表中所有sheet名称:',list(data.keys()))
# print(data['meal_order_detail1']) # 当data是个字典的时候可以这么用,取第一个表
查看当前表中所有sheet名称: ['meal_order_detail1', 'meal_order_detail2', 'meal_order_detail3']
2、header表示选择哪一行作为列索引,默认是第一行(header=0)
当header不为0时,会将默认为列索引之前的行全部删掉不读
data=pd.read_excel(r'meal_order_detail.xlsx',header=[0,1])
# print(data)
3、当文件中没有给出表头的时候,需要将header设置成None值,并且传入与列数量一致的list,name=[ ]
data=pd.read_excel(r'meal_order_detail.xlsx',names=np.arange(19),header=None)
# print(data)
4、skiprows:跳过行
data=pd.read_excel(r'meal_order_detail.xlsx',skiprows=[1,10],header=0) # 跳过1和10行,不是1到10行
# print(data)
print(data.head(6)) # 从头开始读,展示前6行,head不写数字默认取5
# print(data.tail(5)) # 从后开始读,展示后5行
七、读取csv文件
1、csv属于文本文件,逗号分隔符文件,编码一般为gbk;
2、read_csv方法中参数说明:
(1)sep:元素分隔符,csv文件中默认分隔符为逗号;
(2)engine:底层编译方式,默认为C语言,如果遇到编码问题,可以尝试将engine改为python;
order=pd.read_csv(r'meal_order_info.csv',
sep=',',
encoding='gbk',
engine='python')
print(order.head())
读取文本文件的方法:.txt、.csv
读取txt和之前numpy的一样
pd.read_table(r'meal_order_info.csv',
sep=',',
encoding='gbk',
engine='python')
order.to_excel('1.xlsx')
order.to_excel('1.xlsx')