【pandas】第二章 pandas基础

【pandas】第二章 pandas基础

Datawhale的pandas学习的开源地址:Joyful Pandas
https://datawhalechina.github.io/joyful-pandas/build/html/%E7%9B%AE%E5%BD%95/ch1.html

欢迎大家关注了解Datawhale :)


一、文件的读取和写入

1. 文件读取

import numpy  as np
import pandas as pd

df_csv   = pd.read_csv('data/my_csv.csv')
df_txt   = pd.read_table('data/my_table.txt')
df_excel = pd.read_excel('data/my_excel.xlsx')

常用参数:
header=None 表示第一行不作为列名
index_col 表示把某一列或几列作为索引,例index_col=[‘col1’, ‘col2’]
usecols 表示读取列的集合,默认读取所有的列,例usecols=[‘col1’, ‘col2’]
parse_dates表示需要转化为时间的列,例parse_dates=[‘col5’]
nrows 表示读取的数据行数,例nrows=2
sep 分割参数,例sep=’ \|\|\|\| ’
engine 指定引擎,例engine=‘python’

2. 数据写入

df_csv.to_csv('data/my_csv_saved.csv', index=False)
df_excel.to_excel('data/my_excel_saved.xlsx', index=False)

常用参数:
index = False保存文件时不保存索引

pandas 中没有定义 to_table 函数,但是 to_csv 可以保存为 txt文件,并且允许自定义分隔符,常用制表符 \t分割:

df_txt.to_csv('data/my_txt_saved.txt', sep='\t', index=False)

将表格快速转换为markdown和latex语言时,可以使用to_markdownto_latex 函数(需要安装tabulate包)

二、基本数据结构

pandas两种基本数据存储结构:
 一维Series
 二维DataFrame

1. Series

Series一般由四部分组成:
data 序列的值 + index 索引 + dtype 存储类型 + name 序列的名字

可以通过.取出这些属性
.values取值,.index取索引,.dtype取类型,.name取名字

当然,最重要的也就是索引取值,可以通过 [index_item] 可以取出

s = pd.Series(data = [100, 'a', {'dic1':5}],
              index = pd.Index(['id1', 20, 'third'], name='my_idx'),
              dtype = 'object',
              name = 'my_name')

2. DataFrame

DataFrame 在 Series 的基础上增加了列索引,一个数据框可以由二维的 data 与行列索引来构造:

df = pd.DataFrame(data = {'col_0': [1,2,3], 
                          'col_1':list('abc'),
                          'col_2': [1.2, 2.2, 3.2]},
                   index = ['row_%d'%i for i in range(3)])

三、常用基本函数

1. 汇总函数

head, tail 函数分别表示返回表或者序列的前 n 行和后 n 行,其中n默认为5
info, describe 分别返回表的 信息概况 和表中 数值列对应的主要统计量

2. 特征统计函数

sum, mean, median, var, std, max, min
quantile, count, idxmax :分位数、非缺失值个数、最大值对应的索引

上面这些所有的函数,由于操作后返回的是标量,所以又称为聚合函数,它们有一个公共参数axis,默认为0代表逐列聚合,如果设置为1则表示逐行聚合

3. 唯一值函数

uniquenunique 可以分别得到其唯一值组成的列表和唯一值的个数
value_counts 可以得到唯一值和其对应出现的频数

如果想要观察多个列组合的唯一值,可以使用 drop_duplicates。其中的关键参数是 keep ,默认值 first 表示每个组合保留第一次出现的所在行,last表示保留最后一次出现的所在行, False 表示把所有重复组合所在的行剔除。

df_demo.drop_duplicates(['Name', 'Gender'],
                      keep=False).head()

4. 替换函数

replace 中,可以通过字典构造,或者传入两个列表来进行替换:

df['Gender'].replace({'Female':0, 'Male':1}).head()
# 等价于
df['Gender'].replace(['Female', 'Male'], [0, 1]).head()

另外, replace 还有一种特殊的方向替换,指定 method 参数为ffill则为用前面一个最近的未被替换的值进行替换,bfill 则使用后面最近的未被替换的值进行替换。从下面的例子可以看到,它们的结果是不同的:
在这里插入图片描述
逻辑替换包括了wheremask
where 函数在传入条件为 False 的对应行进行替换,而 mask 在传入条件为 True 的对应行进行替换,当不指定替换值时,替换为缺失值。

s.where(s<0, 100)
s.mask(s<0, -50)

s_condition= pd.Series([True,False,False,True],index=s.index)
s.mask(s_condition, -50)

数值替换包含了 round, abs, clip 方法,它们分别表示按照给定精度四舍五入、取绝对值和截断

s = pd.Series([-1, 1.2345, 100, -50])
s.round(2)   # 两位小数
s.abs()      # 取绝对值
s.clip(0, 2) # 上下截断边界

练一练:在 clip 中,超过边界的只能截断为边界值,如果要把超出边界的替换为自定义的值,应当如何做?

可以使用replace替换边界值

s.clip(0,2).replace(2,999)

5. 排序函数

sort_values 和 sort_index :其一为值排序,其二为索引排序,,默认参数 ascending=True 为升序

在排序中,经常遇到多列排序的问题,比如在体重相同的情况下,对身高进行排序,并且保持身高降序排列,体重升序排列:

# 值排序
df_demo.sort_values(['Weight','Height'],ascending=[True,False]).head()

# 索引排序,level参数(字符串的排列顺序由字母顺序决定)
df_demo.sort_index(level=['Grade','Name'],ascending=[True,False]).head()

6. apply方法

apply 方法常用于 DataFrame 的行迭代或者列迭代

df_demo = df[['Height', 'Weight']]
df_demo.apply(lambda x:x.mean())

在这里插入图片描述

四、窗口对象

pandas 中有3类窗口,分别是
滑动窗口 rolling 、扩张窗口 expanding 以及指数加权窗口 ewm

1. 滑窗对象

要使用滑窗函数,就必须先要对一个序列使用 .rolling 得到滑窗对象,其最重要的参数为窗口大小 window 。

s = pd.Series([1,2,3,4,5])
roller = s.rolling(window = 3) # 滑窗对象
roller.mean() # NaN NaN 2 3 4
roller.sum()  # NaN NaN 6 9 12

s2 = pd.Series([1,2,6,16,30])
roller.cov(s2)  # 滑动相关系数
roller.corr(s2) # 滑动协方差

shift, diff, pct_change是一组类滑窗函数,它们的公共参数为 periods=n,默认为1分别表示
取向前第 n 个元素的值、与向前第 n 个元素做差、与向前第 n 个元素相比计算增长率

s = pd.Series([1,3,6,10,15])
s.shift(2) # nan nan 1 3 6
s.diff(3)  # nan nan nan 9 12
s.pct_change() # nan 2 1 0.66667 0.5
s.shift(-1) # 3 6 10 15 nan
s.diff(-2)  # -5 -7 -9 nan nan

将其视作类滑窗函数的原因是,它们的功能可以用窗口大小为 n+1 的 rolling 方法等价代替:

s.rolling(3).apply(lambda x:list(x)[0]) # s.shift(2)
s.rolling(4).apply(lambda x:list(x)[-1]-list(x)[0]) # s.diff(3)

def my_pct(x):
	L = list(x)
	return L[-1]/L[0]-1
s.rolling(2).apply(my_pct) # s.pct_change()

2. 扩张窗口

扩张窗口又称累计窗口,可以理解为一个动态长度的窗口,其窗口的大小就是从序列开始处到具体操作的对应位置,其使用的聚合函数会作用于这些逐步扩张的窗口上。具体地说,设序列为a1, a2, a3, a4,则其每个位置对应的窗口即[a1]、[a1, a2]、[a1, a2, a3]、[a1, a2, a3, a4]
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿芒Aris

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值