Numpy基本操作
Numpy、DataFrame和matplotlib可以说是数据分析师必会的三个模块,使用起来非常方便。
# 原数据
data0 = [['id', 'name', 'time', 'city', 'age', 'score', 'money', 'type'],
[1011, '张三', '2019-09-11', '北京', 23, 82, 201, 'A1'],
[1019, '李四', '2019-09-20', '北京', 35, 77, 150, 'A2'],
[1109, '王五', '2020-09-18', '上海', 28, 90, 277, 'B2'],
[1130, '钱六', '2020-09-29', '上海', 31, 88, 230, 'B1'],
[1301, '赵七', '2020-09-07', '深圳', 29, 92, 300, 'C2'],
[1328, '孙八', '2020-09-08', '深圳', 30, 81, 190, 'C1'],
[1207, '张九', '2020-09-17', '广州', 39, 88, 210, 'D1'],
[1277, '赵十', '2020-09-22', '广州', 28, 93, 250, 'D2']]
# 一般都会转为DataFrame格式
data = pd.DataFrame(data0[1:], index=None, columns=data0[0])
数据描述
- 数据描述 数据的行列数
data.shape
out:(8, 8)
- 数据示例
data.head() # 展示前几行数据
out:
id name time city age score money type
0 1011 张三 2019-09-11 北京 23 82 201 A1
1 1019 李四 2019-09-20 北京 35 77 150 A2
2 1109 王五 2020-09-18 上海 28 90 277 B2
3 1130 钱六 2020-09-29 上海 31 88 230 B1
4 1301 赵七 2020-09-07 深圳 29 92 300 C2
# data.head(5) # 展示前5行数据
- 数据索引
# 列索引
data.columns
out:
Index(['id', 'name', 'time', 'city', 'age', 'score', 'money', 'type'], dtype='object')
# 行索引
data.index
out:
RangeIndex(start=0, stop=8, step=1)
数据切片
- iloc 通过位置来索引,0,1,2,…,iloc索引是左闭右开
- loc 通过标签来索引,‘id’,'name‘,…,loc索引是左闭右闭
data.iloc[1:3, 2:4]
out:
time city
1 2019-09-20 北京
2 2020-09-18 上海
data.loc[1:3, ['time', 'city']
out:
time city
1 2019-09-20 北京
2 2020-09-18 上海
3 2020-09-29 上海
- 进阶用法
data.loc[data['age'][(data['age'] > 10) & (data['age'] < 25)].index, 'age'] = '青少年'
# 将年龄大于10且小于25的年龄换成‘青少年’
data.loc[(data['score'].isnull()), 'score'] = 0
# 将'score'列为空的值转为0
a = data.loc[data['age'][(data['age']>20)|(data['age']<10)].index, 'name']
# 年龄大于20或小于10的人的名字
空值处理
- 剔除空值
# dropna()函数 axis=0表示纵向操作,axis=1表示横向操作
# drop()有个参数inplace,默认为False,表示是否修改源数据,为True则在源数据上修改,否则生成副部。
data.dropna(axis=0, inplace=False) # 删除包含空值的行
data.dropna(axis=1) # 删除包含空值的列
data.dropna(how='all', axis=0) # 删除整行均为空值的行
data.dropna(subset=['id', 'score'], axis=0) # 删除'id', 'score'包含空值的行
data.dropna(axis=0, thresh=n) # 删除所有小于n个空值的行
- 填充空值
# fillna()函数,axis和inplace参数同dropna()
data['city'].fillna('未知') # 用'未知'填充'city'中的空值
data['score'].fillna(data['score'].mean()) # 用'score'的平均值填充空值
data['score'].fillna(method='ffill') # 用上一个非空值填充
data['score'].fillna(random.randint(80, 100)) # 用随机数填充
- 筛选空值
data[data['city'].isnull()==True] # 筛选'city'为空的全部数据
data['city'].isnull()==True # 判断是否为空,返回布尔型,基于pandas
data['city'].isna()==True # 判断是否为空,返回布尔型,基于pandas
data['city'] is np.nan # 返回布尔型
data['mission'] == np.nan # 返回布尔型
np.isnan(data['mission']) == True # 返回布尔型
# 上面几种返回布尔型的判断空值的方法有一定差别
数据替换/重命名
- 数据替换
data['city'].replace('北京', 1) # 用1代替'北京'
data['city'].replace(['北京', '上海'], [1, 2]) # 用1代替'北京',2代替'上海'
- 重命名
# 更改行索引
data.rename(index={1: 'a', 2: 'b', 3: 'c'}) # 将行索引中的1,2,3分别换成'a','b','c'
data.renam(index=lambda x: expression) # 用lambda函数批量修改索引名
# 更改行索引
data.set_index('id') # 将id作为索引,而不是默认的0,1,2,...
# 更改列索引
data.rename(columns={'city': 'city_name', 'id': 'user_id'}
# 将'city','id'换成'city_name','user_id'
数据统计
data.describe() # 查看数据值,列汇总统计,包含计数、均值、标准差、四分位数等
data.mean() # 所有列的均值
data.min(),data.max(),data.median() # 每一列的最小、最大、中位数、
data.std(),data.var() # 标准差、方差
data.corr() # 列与列之间的相关系数
data.count() # 列的非空值的个数
data.info() # 字段基本信息(类型、空值等)
data.unique() # 字段的唯一值
小结
Numpy和Pandas有很多的相似之处,因此,很多的操作我后面会放在Pandas的使用中说明,例如很重要的groupby()、merge()、apply()。