pandas

1、表格数据的操作:【增删改查】
2、实现多个表格的处理
3、数据清洗操作:异常值、缺失值、重复值、数据标准化、数据转化的操作
4、实现excel的特殊操作:生成透视表、交叉表
5、完成统计分析

import pandas as pd
import numpy as np

一、构建dataframe

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

二、dataframe属性

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)) # <class 'pandas.core.series.Series'>
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

五、excel文件读取

# pd.read_excel(r'路径')

补充内容

1、series构建

series只有index索引,没有columns索引

pd.Series(data=['lx','ss','zs'],index=[0,1,2])
0    lx
1    ss
2    zs
dtype: object

六、读取excel数据:

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

想保存什么格式的,就to_什么

order.to_excel('1.xlsx')    

本文地址:https://blog.csdn.net/weixin_50199986/article/details/111936650