欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

pandas操作

程序员文章站 2022-03-08 15:50:17
pandas1、表格数据的操作:【增删改查】2、实现多个表格的处理3、数据清洗操作:异常值、缺失值、重复值、数据标准化、数据转化的操作4、实现excel的特殊操作:生成透视表、交叉表5、完成统计分析import pandas as pdimport numpy as np一、构建dataframedataframe一定是二维的df=pd.DataFrame(data=[['ss',20,'男','0831'],['lx',18,'女','0830'],['lx',22,'女','083...

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

相关标签: 数据分析 pandas