python大数据分析——pandas基本数据类型类型及操作
前言
python用于数据分析,需要使用 pandas 库。
一、pandas是什么?
pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的,提供了大量能使我们快速便捷地处理数据的函数和方法。
为什么学?
numpy能够帮助我们处理数值,但是pandas除了处理数值之外还能处理其他类型的数据(如字符串)。
二、使用步骤
1.引入库
pandas有两种数据类型:
- Series:一维,带标签(即索引)数组
- DataFrame:二维,Series容器。任取 DataFrame 的一行或一列,都是一个 Series。
下面介绍如何使用 DataFrame。
import pandas as pd
from pandas import DataFrame
2.使用库
1)构建DataFrame
- 列标签为字典的键——通过columns属性显式指定列排列顺序
- 行标签未显式指定,故默认为0到n-1——通过index属性显式指定行标签
缺少的值会用 NAN 填充。
有两种方法可以构建 DataFrame:
- 直接构建:
pd.DataFrame(np.arange(12).reshape((3,4)), index=list("abc"), columns=list("wxyz"))
- 通过字典构建:
pd.DataFrame(字典)
# 字典
data = {'ID': ['000001', '000002', '000003', '000004', '000005', '000006', '000007'],
'name': ['黎明', '赵怡春', '张富平', '白丽', '牛玉德', '姚华', '李南'],
'gender': [True, False, True, False, True, False, True],
'age': [16, 20, 18, 18, 17, 18, 16],
'height': [1.88, 1.78, 1.81, 1.86, 1.74, 1.75, 1.76]
}
frame = pd.DataFrame(data, index=[6,5,4,3,2,1,0])
# ID name gender age height
# 6 000001 黎明 True 16 1.88
# 5 000002 赵怡春 False 20 1.78
# 4 000003 张富平 True 18 1.81
# 3 000004 白丽 False 18 1.86
# 2 000005 牛玉德 True 17 1.74
# 1 000006 姚华 False 18 1.75
# 0 000007 李南 True 16 1.76
2)DataFrame 基础属性和整体情况查询
1.基础属性(不是方法,因此没有括号)
frame.shape #行数列数
frame.dtypes #列数据类型
frame.ndim #数据维度
frame.index #行索引
frame.columns #列索引
frame.values #对象值,二维ndarray数组
2.整体情况查询
frame.head(3) #显示头部几行,默认5行
frame.tail(3) #显示末尾几行,默认5行
frame.info() #相关信息概览:行数,列数,列索引,列非空值个数,列类型,列类型,内存占用
frame.describe() #快速综合统计结果:计数,均值,标准差,最大值,四分位数,最小值
frame.sort_values(by="列名", ascending=True/False) #按某一列降序或升序排序
3)DataFrame 索引
3.1)基本索引
- 方括号写数字,表示取行
- 方括号写字符串,表示取列
取完之后type(data[])
显示为Series
类型
1.列索引
print(frame['name'])
# 6 黎明
# 5 赵怡春
# 4 张富平
# 3 白丽
# 2 牛玉德
# 1 姚华
# 0 李南
# Name: name, dtype: object
print(frame[['name','age']])
# name age
# 6 黎明 16
# 5 赵怡春 20
# 4 张富平 18
# 3 白丽 18
# 2 牛玉德 17
# 1 姚华 18
# 0 李南 16
print(frame.name)
# 6 黎明
# 5 赵怡春
# 4 张富平
# 3 白丽
# 2 牛玉德
# 1 姚华
# 0 李南
# Name: name, dtype: object
2.行索引
print(frame[2:7])
# ID name gender age height
# 4 000003 张富平 True 18 1.81
# 3 000004 白丽 False 18 1.86
# 2 000005 牛玉德 True 17 1.74
# 1 000006 姚华 False 18 1.75
# 0 000007 李南 True 16 1.76
print(frame[2:7:2])
# ID name gender age height
# 4 000003 张富平 True 18 1.81
# 2 000005 牛玉德 True 17 1.74
# 0 000007 李南 True 16 1.76
3.同时进行 行列索引
print(frame['name'][0:1])
print(frame[0:1]['name'])
3.2)iloc & loc
1.iloc函数:使用位置索引数据
print(frame.iloc[1,3]) 选择第2行,第4列数据
print(frame.iloc[1:2,0:3]) 选择第1:2行,第0:3列数据
print(frame.iloc[[3,1],[0,2]]) 选择4和2行,第1和2列共两个数据(4行和2行的位置会变化)
2.loc函数:使用标签获取数据,且包含下界(只有它包含)(如果index=101,102,则索引号不能为1,2,而应该为101,102)
print(frame.loc[0:1]) 选择0:1行,共两个数据
print(frame.loc[[1,3]]) 选择2和4行,共两个数据
同时读取行列:
print(frame.loc[:,['name']])
print(frame.loc[:,['name','age']])
iloc 与 loc 的区别:
frame = pd.DataFrame(data, index=[100,101,102,103,104,105,106])
print(frame[0:1])
# ID name gender age height
# 100 000001 黎明 True 16 1.88
print(frame[100:101])
# Empty DataFrame
print(frame.loc[0:1])
# Columns: [ID, name, gender, age, height]
# Index: []
# Empty DataFrame
print(frame.loc[100:101])
# Columns: [ID, name, gender, age, height]
# Index: []
# ID name gender age height
# 100 000001 黎明 True 16 1.88
# 101 000002 赵怡春 False 20 1.78
3.3)布尔索引
不同条件需要用括号分隔
print(frame[frame['age'] > 17])
print(frame[(frame['age']> 17) & (frame['height'] > 1.80])
print(frame[(frame['age']> 17) & (frame['gender'] == True)])
print(frame[frame['age'].isin([20, 16])])
print(frame['name'[[2, 3]][(frame['height']> 1.80)])
print(framel(frame[height']> 1.80) & (frame['gender] == True)]['name']) 查询身高大于1.80的男生姓名
4)缺失数据的处理
1.处理 NaN 数据
判断数据是否为NaN: pd.isnull(frame)、pd.notnull(frame)
-
删除NaN所在的行列:
frame.dropna (axis=0, how='any / all', inplace=False)
how: any:只要有 NaN 就删除这一行/列
all:全部为 NaN 才删除
inplace:对数据是否进行原地修改 -
填充数据:
frame.fillna(0)、frame.fillna(frame.mean())、frame.fillna(frame.median())
2.处理为0的数据(赋值为 NaN frame[frame==0] = np.nan
)
当然,并不是每次为0的数据都需要处理。
在pandas 中计算平均值等数值时,NaN 是不参与计算的,但是0会(numpy 中 NaN 参与计算)。