pandas入门指南

上一篇讲了numpy,除此之外,还有一个工具我们一定会使用,那就是pandas。如果说numpy中数据存储形式是列表的话,那么pandas中数据的存储形式更像是字典。为什么这么说呢?因为pandas中的数据每一行每一列都有名字,而numpy中没有。本文主要介绍pandas的基本使用方法,更多高级用法大家可以参考 pandas官方文档

一、pandas的安装及导入

安装:命令行中输入以下代码

pip3 install pandas

导入:为了简便,这里使用pd作为pandas的缩写(因为pandas依赖numpy,所以在使用之前需要安装和导入numpy)

import numpy as np
import pandas as pd

二、新建pandas列表、矩阵及其属性

创建方法:
pd.Series:创建pandas列表
pd.date_range:创建pandas日期列表
pd.DataFrame:创建pandas矩阵
矩阵属性
dtypes:数据类型
index:行名
columns:列名
values:数据值
describe():实值数据列的统计数据
T:矩阵的倒置
sort_index(axis=, ascending=):矩阵排序{axis:0(行排序),1(列排序)}{ascending:True(升序),False(降序)}
sort_values(by=, ascending=):按某一列的值排序{by:列名}

s = pd.Series([1, 3, 6, np.nan, 23, 3])
dates = pd.date_range('20180708', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=['a', 'b', 'c', 'd'])
df2 = pd.DataFrame({
  'a':pd.Series([1, 2, 3, 4]),
  'b':pd.Timestamp('20180708'),
  'c':pd.Categorical(['cate1', 'cate2', 'cate3', 'cate4'])
})
print(df2)
print(df2.dtypes)
print(df2.index)
print(df2.columns)
print(df2.values)
print(df2.describe())
print(df2.T)
print(df2.sort_index(axis=1, ascending=False))
print(df2.sort_index(axis=0, ascending=False))
print(df2.sort_values(by='a', ascending=False))

三、pandas选择数据

.列名:选择某一列
[列名]:选择某一列
[start : end]:选择行索引以start开头,end - 1结尾的数据
[行名start:行名end]:选择行名以start开头,end结尾的数据
loc[行名选择, 列名选择]:根据行名和列名选择数据
iloc[行索引选择, 列索引选择]:根据行索引和列索引选择数据
ix[行 名/索引 选择,列 名/索引 选择]:混合 名/索引 选择数据
[布尔表达式]:根据布尔表达式结果选择数据,只有当布尔表达式为真时的数据才会被选择

dates = pd.date_range('20180709', periods=3)
df = pd.DataFrame(np.arange(12).reshape((3, 4)), index=dates, columns=['A', 'B', 'C', 'D'])
print(df.A)
print(df['A'])
print(df[2:3])
print(df['20180709':'20180710'])

# loc: select by label
print(df.loc['20180711'])
print(df.loc[:,['B','C']])

# iloc : select by position
print(df.iloc[1:3, 2:4])
print(df.iloc[[0, 2], 2:4])

# ix : mixed selection
print(df.ix[[0, 2], ['B']])

# Boolean indexing
print(df[df.A > 3])

四、pandas设置数据值

首先选择数据,然后直接通过赋值表达式,即可将选择的数据设置为相应的值

dates = pd.date_range('20180709', periods=3)
df = pd.DataFrame(np.arange(12).reshape((3, 4)), index=dates, columns=['A', 'B', 'C', 'D'])
df.loc['20180709', 'B'] = 666
df.iloc[2, 2] = 999
df.ix['20180709', 3] = 777
df.A[df.A > 3] = 888
df['F'] = np.nan
print(df)

五、pandas处理NaN值

dropna(axis=, how=):丢弃NaN数据,{axis:0(按行丢弃),1(按列丢弃)} {how:'any'(只要含有NaN数据就丢弃),'all'(所有数据都为NaN时丢弃)}
fillna(value=):将NaN值都设置为value的值
isnull():对每各元素进行判断是否是NaN,返回结果矩阵
np.any(matrix) == value:判断matrix矩阵中是否有value值
np.all(matrix) == value:判断matrix矩阵中是否所有元素都是value值

dates = pd.date_range('20180709', periods=5)
df = pd.DataFrame(np.arange(20).reshape((5, 4)), index=dates, columns=['A', 'B', 'C', 'D'])
df.iloc[3, 3] = np.nan
print(df.dropna(axis=1, how='all')) # how = {'any', 'all'}
print(df.fillna(value=666))
print(df.isnull())
print(np.any(df.isnull()) == True)
print(np.all(df.isnull()) == True)

六、pandas读取数据、导出数据

根据数据的格式,pandas提供了多种数据读取和导出的方法,如:
读取数据:read_csv、read_table、read_fwf、read_clipboard、read_excel、read_hdf
导出数据:to_csv、to_table、to_fwf、to_clipboard、to_excel、to_hdf

df = pd.read_csv('Q1.csv')
print(df)
df.to_csv('Q1_pandas.csv')

七、pandas合并数据

concat方法
第一个参数:需要合并的矩阵
axis:合并维度,0:按行合并,1:按列合并
join:处理非公有 列/行 的方式,inner:去除非公有的 列/行,outer:对非公有的 列/行 进行NaN值填充然后合并
ignore_index:是否重排行索引

df1 = pd.DataFrame(np.arange(12).reshape(3, 4), columns=['A', 'B', 'C', 'D'], index=[0, 1, 2])
df2 = pd.DataFrame(np.ones((3, 4)), columns=['B', 'C', 'D', 'E'], index=[1, 2, 3])

print(pd.concat([df1, df2], join='outer', ignore_index=True)) # join = {'outer', 'inner'}
print(pd.concat([df1, df2], axis=1, join_axes=[df1.index]))
print(df1.append([df2], ignore_index=True))

merge方法
第一个参数、第二个参数:需要合并的矩阵
on:公有列名
how:处理非公有行的方式,inner:去除非公有行,outer:对非公有的行进行NaN值填充然后合并,left:保留左矩阵的所有行,对非公有的元素进行NaN值填充,right:保留右边矩阵的所有行,对非公有的元素进行NaN值填充
indicator:是否显示每一行的merge方式
suffixes:非公有列的列名后缀

df1 = pd.DataFrame({
  'key':['K1', 'K2', 'K3'],
  'A':['A1', 'A2', 'A3'],
  'B':['B1', 'B2', 'B3']
})
df2 = pd.DataFrame({
  'key':['K1', 'K2', 'K3'],
  'C':['C1', 'C2', 'C3'],
  'D':['D1', 'D2', 'D3']
})
print(pd.merge(df1, df2, on='key'))
df3 = pd.DataFrame({
  'key1':['K1', 'K1', 'K0'],
  'key2':['K1', 'K0', 'K1'],
  'col':[1, 2, 3]
})
df4 = pd.DataFrame({
  'key1':['K0', 'K1', 'K0'],
  'key2':['K1', 'K0', 'K0'],
  'col':[6, 7, 8]
})
# how = {'inner', 'outer', 'left', 'right'}
print(pd.merge(df3, df4, on=['key1', 'key2'], how='right', suffixes=['_left', '_right'], indicator=True))

八、pandas数据可视化

pandas数据可视化依赖matplotlib库,所以在可视化数据之前应该先导入该库

import matplotlib.pyplot as plt

首先通过np.ramdom方法生成四列随机数据
然后通过cumsum对随机数据做累加
再通过scatter方法以其中两列为绿色点X, Y的值,另两列为蓝色点X, Y的值
最后使用plt.show()方法画图

data = pd.DataFrame(np.random.randn(1000, 4),
  index=np.arange(1000),
  columns=list("ABCD"))
data = data.cumsum()
# plot methods:
# 'bar', 'hist', 'box', 'kde', 'area', 'scatter', 'hexbin', 'pie'
ax = data.plot.scatter(x='A', y='B', color='blue', label='class 1')
data.plot.scatter(x='C', y='D', color='green', label='class 2', ax=ax)
plt.show()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355

推荐阅读更多精彩内容