pandas
1.表格数据操作;【增删改查】
2.实现多个表格的处理;
3.数据清洗操作: 缺失值,重复值,异常值,数据标准化,数据转换的操作;
4.实现excel的特殊操作:生成透视表,交叉表;
5.完成统计分析;
import pandas as pd
import numpy as np
一、构建dataframe
创建方法一:
df = pd.DataFrame(data=[['ss',20, '男','0831'],['lx',20, '女','0830'],['lx',22, '女','0830']],
index=['a','c', 'b'],
columns=['name','age','sex','class'],)
print(df)
name age sex class
a ss 20 男 0831
c lx 20 女 0830
b lx 22 女 0830
创建方法二:
df2 = pd.DataFrame(data={'name':['ss','lx'],
'age':[20, 18],
'sex':['男','女'],
'class':['0831','0830']})
print(type(df2))
<class 'pandas.core.frame.DataFrame'>
二、dataframe属性
print('df结构:\n', df.shape)
print('df维度:\n', df.ndim)
print('df元素个数:\n', df.size)
print('df数据类型:\n', df.dtypes)
print('df的列索引:\n', df.columns)
print('df的行索引:\n', df.index)
print('df的元素:\n', type(df.values)) #<class 'numpy.ndarray'>
df结构:
(3, 4)
df维度:
2
df元素个数:
12
df数据类型:
name object
age int64
sex object
class object
dtype: object
df的列索引:
Index(['name', 'age', 'sex', 'class'], dtype='object')
df的行索引:
Index(['a', 'c', 'b'], dtype='object')
df的元素:
<class 'numpy.ndarray'>
三、df的查找
series是一维的类型,只有一个轴
- 切一列值的方法
ser = df['name'] # 一维的切法,返回的是series类型
print(type(ser)) # <class 'pandas.core.series.Series'>
<class 'pandas.core.series.Series'>
2.切多列值的方法
df[['name', 'age']][:2]
name | age | |
---|---|---|
a | ss | 20 |
c | lx | 18 |
- 索引; df.loc[行索引名称/条件, 列的索引名称]
print(df)
name age sex class
a ss 20 男 0831
c lx 18 女 0830
b lx 22 女 0830
# print(df.loc['a', 'name'])
# print(df.loc[['a','b'], 'name'])
# print(df.loc[['a','b'], ['name','age']])
print(df.loc[:'b', 'name']) # 前闭后闭
a ss
c lx
b lx
Name: name, dtype: object
3.条件切片
例: 获取所有年龄大于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
例: 获取所有年龄大于18岁的女同学
mask1 = df['age']>18
mask2 = df['sex'] == '女'
mask3 = mask1 & mask2
df.loc[mask3, :]
name | age | sex | class | |
---|---|---|---|---|
b | lx | 22 | 女 | 0830 |
df.iloc[行的位置索引, 列的位置索引]
print(df)
name age sex 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:] # 前闭后开
sex | class | |
---|---|---|
a | 男 | 0831 |
c | 女 | 0830 |
df.iloc[-1, :].index
Index(['name', 'age', 'sex', 'class'], dtype='object')
4.df增加方法
(1)增加一列:
df['address'] = ['北京','上海','北京']
print(df)
name age sex class address
a ss 20 男 0831 北京
c lx 18 女 0830 上海
b lx 22 女 0830 北京
df['address'] = '北京'
print(df)
name age sex 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],
'sex':['男','女'],
'class':['0831','0830']},index=['a','b'])
df3 = df.append(df_mini,ignore_index=True )
#ignore_index: 表示忽略原始索引,重新设置索引
print(df3)
address age class name sex
0 北京 20 0831 ss 男
1 北京 18 0830 lx 女
2 北京 22 0830 lx 女
3 NaN 20 0831 ss 男
4 NaN 18 0830 lx 女
- 删除方法
inplace: 表示是否对原表进行修改,True为直接修改原始表格, False为不修改;
#删除列:
df3.drop(labels=['address','class'], axis=1)
age | name | sex | |
---|---|---|---|
0 | 20 | ss | 男 |
1 | 18 | lx | 女 |
2 | 22 | lx | 女 |
3 | 20 | ss | 男 |
4 | 18 | lx | 女 |
df3.drop(labels=[0, 2], axis=0, inplace=True)
print(df3)
address age class name sex
3 NaN 20 0831 ss 男
4 NaN 18 0830 lx 女
- df更改数值方法
print(df)
name age sex 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 sex class address
a ss 20 男 0831 北京
c lx 18 女 有问题 北京
b lx 22 女 有问题 北京
四、统计分析
- numpy 统计方法:
print(df)
name age sex class address
a ss 20 男 0831 北京
c lx 18 女 有问题 北京
b lx 22 女 有问题 北京
#2. 延用numpy中的10个统计分析方法:
np.mean(df['age'])
20.0
#3. 其它方法:
np.ptp(df['age']) #极差 : max-min
4
print(df)
name age sex class
a ss 20 男 0831
c lx 20 女 0830
b lx 22 女 0830
#4. pandas中的方法:
# (1) 针对series:
# df['age'].min() #df与series中通用
# df['age'].std() #df与series中通用
# df['age'].argmax() #只能在series中使用
# df['name'].mode() # 众数 #df与series中通用
# df['name'].count() # 非空数目 #df与series中通用
# df['name'].value_counts() # 频数统计 #只能在series中使用
#(2) 针对df类型
print(df)
df['grade'] = [98, 90, 92]
name age sex class grade
a ss 20 男 0831 98
c lx 20 女 0830 90
b lx 22 女 0830 92
print(df[['age', 'grade']].idxmax(axis=1)) # 最大值索引, 横向比较;
a grade
c grade
b grade
dtype: object
print(df[['age', 'grade']].idxmax(axis=0)) # 最大值索引,纵向比较;【一维,二维都可以使用]
age b
grade a
dtype: object
print(df.mode()) #众数 【ser和pandas中都可以使用】
name age sex class grade
0 lx 20.0 女 0830 90
1 NaN NaN NaN NaN 92
2 NaN NaN NaN NaN 98
print(df[['age','grade']].describe())
age grade
count 3.000000 3.000000
mean 20.666667 93.333333
std 1.154701 4.163332
min 20.000000 90.000000
25% 20.000000 91.000000
50% 20.000000 92.000000
75% 21.000000 95.000000
max 22.000000 98.000000
print(df[['name','sex']].describe())
"""
describe()作用在类别型df中返回值:
count:非空数目
unique: 去重之后有几个值;
top:众数
freq:众数出现的频数
"""
name sex
count 3 3
unique 2 2
top lx 女
freq 2 2
print(df[['age','name']].describe())
age
count 3.000000
mean 20.666667
std 1.154701
min 20.000000
25% 20.000000
50% 20.000000
75% 21.000000
max 22.000000、