Pandas 用户手册——初步认识+数据结构

结合实际案例,所有操作都是本人亲自实践,作为以后自己使用pandas时的用户手册。

目录

第1章 Pandas初步认识

1.1 创建对象

1.2 查看数据

1.3 筛选数据

1.4 处理丢失数据

1.5 表格连接

1.6 分组

1.7 数据透视表

1.8 时间序列

1.9 分类别的数据(Categoricals)

1.10 画图

1.11 读取/存储数据

第2章 Pandas数据结构

2.1 Series

2.2 DataFrame


第1章 Pandas初步认识

1.1 创建对象

一般有两种创建Series和DataFrame的方法,通过字典dict()或者利用Numpy+Index+columns的方法,方法一适合简单的情形,方法二更清晰。

import pandas as pd
import numpy as np
# 创建Series对象
Series_object=pd.Series(data=[1,2,'s','2021-1-1'],index=['A','B','C','D'])
Series_object

# 通过numpy,创建Dataframe对象
Dataframe_object=pd.DataFrame(data=np.random.randn(2,2),index=
                              pd.date_range('20210101',periods=2),columns=list('AB'))
Dataframe_object

# 通过字典,创建Dataframe对象
Dataframe_object2=pd.DataFrame({'A':pd.Timestamp('20210101'),
                                'B':pd.Series(1,index=list(range(3))),
                                'C':pd.Categorical(['one','two','three'])})
Dataframe_object2

# 我们可以通过dtypes查看列的属性
Dataframe_object2.dtypes

1.2 查看数据

Pandas具有简单的查看数据功能,前期对数据要有一定的整体把握。案例的原始数据为:

# 查看前5行数据
Dataframe_object.head()

# 查看后2行数据
Dataframe_object.tail(2)

# 查看表格的索引
Dataframe_object.index

# 查看表格的列名
Dataframe_object.columns

# 将DataFrame转化为Numpy
Dataframe_object.to_numpy()

# 基本的表格统计描述
Dataframe_object.describe()

# 转置表格
Dataframe_object.T

1.3 筛选数据

Pandas筛选数据非常方便,一般有两种选择方法,通过loc[]选择标签、通过iloc[]选择索引位置。

# 选择某一列,类似于df.A
Dataframe_object['A']

# 通过行、列名选择
Dataframe_object.loc[['20210101','20210103'],['A','B']]

# 通过索引的位置选择
Dataframe_object.iloc[1:3,[0,2]]

# 条件选择
Dataframe_object[(Dataframe_object['A']>0)&(Dataframe_object['B']<0)]

1.4 处理丢失数据

Pandas的丢失数据用np.nan代替,不参与计算,所以必须处理丢失数据。本案例的原始数据为:

# 去掉所有含有np.nan的行
Dataframe_object.dropna(how='any')

# 填充np.nan
Dataframe_object.fillna(value=100)

# 找到np.nan的位置,用于筛选
pd.isna(Dataframe_object)

1.5 表格连接

一般有两种连接方式,一种是concat,一种是merge,merge更像SQL风格。

# 通过concat重新连接表格,行操作都是很快
pieces=[Table_concat[3:],Table_concat[:3]]
pd.concat(pieces)

# 通过merge连接表格
Table_merge1=pd.DataFrame({'name':['Sam','Succi'],'Age':[10,12]})
Table_merge2=pd.DataFrame({'name':['Sam','Succi'],'Grade':[64,62]})
pd.merge(Table_merge1,Table_merge2,on='name')

1.6 分组

通过分组我们可以:(1)把表格分成不同的组别;(2)对每个组别进行独立的Apply操作;(3)结果分析。

# 计算A中不同组别的C的和
Table_group.groupby('A').sum()

# 二级分组后的A、B组别的C的和
Table_group.groupby(['A','B']).sum()

1.7 数据透视表

针对1.6的原始数据,做一个简单的数据透视。

# 数据透视表
pd.pivot(Table_group,values='C',index='A',columns='B')

1.8 时间序列

pandas的时间序列很强大,适用于金融等采样工作。

# 首先建立样本
time_series = pd.date_range("1/1/2021", periods=10, freq="D")
sample = pd.Series(np.random.randint(0, 500, len(time_series)), index=time_series)
sample

# 按照2天一次重新采样
sample.resample('2D').sum()

1.9 分类别的数据(Categoricals)

Pandas可以设置数据的类别,从而方便的进行筛选、Apply等操作。

# 原始数据
cate=pd.DataFrame({"id": [1, 2, 3, 4, 5, 6], "raw_grade": ["a", "b", "b", "a", "a", "e"],'grade':[76,65,43,55,56,87]})
cate

# 把a/b/c三种数据改成类别
cate['class']=cate['raw_grade'].astype('category')
cate['class']

# 重新改变类别的名称
cate['class'].cat.categories = ["nice", "general", "bad"]
cate

# 查看不同类别数据的数据平均分
cate.groupby('class')['grade'].mean()

1.10 画图

# 生成两列时间序列数据
rand_number=pd.DataFrame(np.random.randn(1000,2), index=pd.date_range("1/1/2021", periods=1000),columns=['S1','S2'])
rand_number

# 统计累计和情况
rand_number=rand_number.cumsum()
rand_number

# 画图
import matplotlib.pyplot as plt
plt.close("all")
rand_number.plot()
plt.legend(loc='best')

1.11 读取/存储数据

一般的数据格式包络csv/HDF5/EXCEL等,相应的读取方式为:pd.read_csv、pd.read_hdf、pd.read_excel,存储方式为:df.to_csv、df.to_hdf、df.to_excel。

 

第2章 Pandas数据结构

2.1 Series

Series是一维数据结构,可以包含任何数据形式,同时通过Index进行查找。在创建Series的时候,一般有两种方式:

# 方法一,通过numpy+index创建
Series_test=pd.Series(np.random.randn(6),index=['A','B','C','D','E','F'])
Series_test

# 方法二,通过字典创建
Series_test2=pd.Series({'A':1,'B':'moore','C':1.3,'D':'2021-1-1'})
Series_test2

Series和ndarray非常像,很多Numpy函数都可以使用,同时切片等矢量化操作也可以使用。

# 切片
Series_test[[1,3]]

# 查看类型
Series_test.dtype

# 转化成ndarray
Series_test.to_numpy()

# 通过Index切片
Series_test['E']

# index没有的时候,防止报错可以使用get方法
Series_test.get('S','没有数据')

# 矢量化操作
np.exp(Series_test)

# 矢量操作时,如果不同的数据错位,在生成的新Series中的Index就会填充nan
Series_test[:-1]+Series_test[1:]

2.2 DataFrame

(1)创建DataFrame的方法主要有以下5种:

  1. 字典
  2. 2维的numpy.ndarray
  3. 结构化的ndarray
  4. Series
  5. 其他的DataFrame
# 通过字典创建
Dataframe_test=pd.DataFrame({'name':['kim','sac','ret'],'year_old':[12,32,43],'sex':['M','F','M']},index=[1,2,3])
Dataframe_test

# 通过numpy或者List创建
Dataframe_test2=pd.DataFrame(np.random.rand(2,2),index=['A','B'],columns=['kim','sac'])
Dataframe_test2

# 通过具名元组namedtuple
from collections import namedtuple
name_tuple=namedtuple('student','kim sac ret')
pd.DataFrame([name_tuple(2,3,4),name_tuple(1,2,2),name_tuple(2,5,6)])

(2)列的操作包括:列运算、增加列、删除列。

# 列互相运算,此方法可以通过assign来简化
df_columns['C']=df_columns['A']+df_columns['B']
df_columns

# 通过判断新增列
df_columns['judge']=df_columns['A']>1
df_columns

# 通过series新增列
df_columns['series1']=pd.Series(['kim','sac','ret'],index=[0,1,2])
df_columns

# 通过插入新增列
df_columns.insert(1,'insert_column',[1,1,1])
df_columns

# 删除列
del df_columns['judge']
df_columns

(3)数据对齐

# 数据整合对齐
data1=pd.DataFrame({'A':[1,2,3],'B':[4,5,6]})
data2=pd.DataFrame({'A':[1,2,3,4],'B':[4,5,6,7],'C':[5,6,7,8]})

data1+data2

(4)和numpy 的互相操作

Dataframe和Series同样适用于numpy的众多函数,比如log, exp, sqrt,maximum等。

(5)pandas的默认显示

pandas通过display()设置默认的显示方式,这点在我之前的文章已经详细介绍过,参考连接:https://blog.csdn.net/qq_40732962/article/details/114198875

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值