import pandas as pd
import numpy as np
1. pandas的数据结构---series
s = pd.Series(np.random.rand(5))
print(type(s))
# 所以series是什么?
# 解释:带索引的ndarray(类似于字典,用index表示索引,values表示值)
# (1) 因此可以用字典创建
dic = {'a':1, 'b' : 2, 'c':3, 'd':4}
s = pd.Series(dic)
# (2) 可以用数组创建
s = pd.Series(np.random.rand(5)) # 默认index是0,1,2,3,4
s = pd.Series(np.random.rand(5), index = ['a', 'b', 'c', 'd','e'], dtype = np.object)
# 可以给一个series起个名字
s = pd.Series(np.random.rand(5), name = 'test')
s1 = s.rename('test1')
# 删除字段
s.drop('a', inplace = True)
2.pandas的数据结构---dataframe
data = {'name': ['Jack', 'Tom', 'Mary'],
'age': [18, 19, 20],
'gender': ['m', 'm', 'w']}
frame = pd.DataFrame(data)
# name age gender
# 0 Jack 18 m
# 1 Tom 19 m
# 2 Mary 20 w
print(frame.columns) # Index['name', 'age', 'gender']
print(frame.index) # RandgeIndex(start = 0, stop = 3, step = 1)
print(frame.values) # 里面的值
# 问题来了。和Series有什么不同,多什么东西了。
# 回答:多了columns,其余创建方法一样
# (1) 因此可以使用字典创建
frame = pd.DataFrame(data, index = ['f1', 'f2', 'f3'], columns = ['b', 'c', 'a', 'd'])
# 这里我重新制定了columns和index,不让他使用默认值
data = {'one': np.random.rand(3),
'two': np.random.rand(3)}
frame = pd.DataFrame(data)
# (2) 使用Series创建,一个Series是一列啊
data = {'one': pd.Series(np.random.rand(3)),
'two': pd.Series(np.random.rand(3))}
frame = pd.DataFrame(data)
# (3) 因此可以使用数组创建
ar = np.random.rand(9).reshape(3,3)
df = pd.DataFrame(ar, index = ['a', 'b', 'c'], columns = ['one', 'two', 'three'])
3. 切片操作三个重点
综上,loc用的多一点,既可以用数字,也可以用columns取。
(1) 取列
df['a','b']
df.loc[:, ['a','b']]
(2) 取最后一行
df.loc[df.index.max()] # loc方法的-1是取不到的,它是从0,1,2,3的正索引,没有负索引
df.iloc[-1] # 这个可以取得到
(3) 取第m行,n-('c')列
df.loc[m, 'c']
df.iloc[m, n] # 这个也是iloc的缺点,无法用'c'直接取到,需要数字代替
4.磁盘读取和保存
df = pd.read_csv('eastmoney.csv', sheet_name = 0, sep = '\t', header = None, names = ['a', 'b','c','d']) # 默认是第一张表,这里的names就是columns,不写也可以
df.loc['蝙蝠侠','装备'] # '蝙蝠战衣'
## 新增一列
df['性别'] = ['m', 'm','w','m']
## 删除一列
df.drop(columns = '性别')
## 删除一行
df.drop(index = '蝙蝠侠')
df.to_csv('成绩单.txt', header = None, index = None)
5.更改数据类型
# 注意使用astype
df.年龄=df.年龄.astype(int)
# 掩码运算
df[(grade.总分>300)&(grade.总分)<400] # 这样可以提取对应的数据了。总分是columns字段
df[~(grade.数学>=90)] # ~表示非,即表示提取数学<90分的同学信息
6.数据统计(这里一般都是指某一列)
## 用到的时候再查吧
np.max(grade.数学)
grade.英语.mean()
grade.总分.sum()
## describe函数
grade.discribe(include = "all") # 显示所有的非数值型的列的一些统计指标
# 如总数,去重后的个数,最常见的值,最常见的值的频数。
grade.discribe(include = 'object') # 对obkect类型的数据统计
grade.genre.value_counts()# 统计genre这一列中不同的值出现的次数
7. 离散
# 如英语成绩分成四个等级
pd.cut(grade.英语, 4) # 将数据均分切分成4份
pd.cut(grade.英语,4 labels=['最差', '挺差', '凑合', '不错'])
# 0 不错
# 1 不错
# 2 ...
# 制定切割点(手动切割)
grade['英语等级'] = pd.cut(grade.英语, bins = [-1, 90 ,120,135,151], right = False, labels = ['','',....])
# [-1, 90), [90, 120),...] # 左闭右开
# cut是根据每个值的大小进行离散化,qcut则是根据每个值出现的次数进行离散化
pd.qcut(grade.语文, 4).value_counts() # 每个类别的样本个数非常接近
8.排序
# (1)值排序
grade.sort_values(by='数学', ascending=False) # 列降序
# 以多列进行排序,如果数学分数相同,我们谁语文分高,谁排前边
grade.sort_values(by=['数学','语文'], ascending =False)
# 多列分别设置
grade.sort_values(by=['数学','语文'], ascending=[True, False])
# (2)索引排序
grade.sort_index(inplace = True)
9.函数应用
map.自己订制函数
## python中的map->映射
L = [1,2,3,4,5,6,7,8,9] # 对列表中的每一个元素变成原来的两倍
map:我们写一个函数,能够对L中的一个元素,放大两倍
def f(x):
return x*2
## map是放函数,不是调用函数
list(map(f,L))
# 我们在series里用
def f2(x): # 奇数缩小十倍,偶数放大10倍
if x%2 == 1:
return x/10
else:
return x*10
grade.数学.map(f2) # 将f2映射到数学columns里来
# 常用功能:性别编码
def f(x):
if x == '男':
return 0
else:
return 1
grade['性别编码'] = grade.性别.map(f)
data_info.最低价 = data_info.最低价.astype('float')
## 练习:总分:如果是10的倍数的分数,中奖可以加10分钟。如果是7的倍数,减50分
其他人分数不变
# map注意点,每一个数传进去都必须有返回值
def f2(x):
if x%10 == 0:
return x+10
else if x%7 == 0:
return x-70
else:
return x
grade.总分 = grade.总分.map(f2)
## 如果想要对多个列操作
def f(x)
if x>=100:
return '好'
else:
return '差'
grade[['语文', '数学', '英语']].applymap(f) # 这里对多个列操作,必须用applymap
10. 修改列的名称
grade.rename(columns={'姓名':'name', '语文':Chinese}) # 里边是个字典
# 只保留列名的第一个字
def f(x):
return x[0]
grade.rename(columns=f)
# 索引变成原来的两倍
def f(x):
return x*2
grade.rename(index=f)
11. 表合并
## (1) 关系型表格,按照某个字段拼接
grade_one = grade.head().copy()
grade_merge = pd.merge(grade_one, room, on='姓名', how='right')
## left:左连接,right:右连接,how = 'inner' 连接方式 on=None:字段
## (2) 索引列对应
grade_one.append(grade_two) # 默认排序,每个字段对应
# 如果对应列不一样
grade_three = grade_two.sort_index(axis = 1) # 对列排序
grade_one.append(grade_two, sort=False) # 不排序,以原表为准
## (3)制定轴排序
# 纵向
pd.concat([grade_one, grade_three], axis=0, sort=False)
# 横向
pd.concat([grade_one, grade_three], axis=0, sort=False)
# join :{'inner', 'outer'}, default 'outer'
# inner : 只要交叉部分
# outer: 不管拼没拼上的都要
pd.concat([grade_one, grade_three,], axis = 1, sort = False, join='inner')
pandas用法总结
最新推荐文章于 2024-02-04 11:05:13 发布