pandas用法总结

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')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值