一文搞定Numpy&Pandas

简单来说,Numpy就是用来进行矩阵计算的,而Pandas则基于Numpy,丰富并简化了Numpy的操作

Numpy

基础操作

import numpy as np

array = np.array([[1, 2, 3],
                  [2, 3, 4]], dtype=np.int) #dtype即元素数据类型

a = np.zeros((3, 4))  # 3行4列的零矩阵
vec = np.arange(10, 20)  # 从10到20的向量
mat_range = np.arange(12).reshape((3, 4))  # 从10到20的3行4列的矩阵
vec_line = np.linspace(1, 10, 3)  # 从1到10分为3个元素的向量,使得相邻元素差值一致

print(array.ndim)  # 维度
print(array.shape)  # (2, 3)
print(array.size)  # 元素个数
print(array.dtype)

b = a.copy() # 深拷贝

基础运算

a = np.array([10, 20, 30, 40]).reshape((2, 2))
b = np.arange(4).reshape((2, 2))
print(a.T) # 矩阵转置

c = 10 * np.sin(a)  # 对a每个元素求sin再乘10

print(b < 3)  # 所有元素比较 [ True  True  True False]

c = a*b  # 对应元素相乘
c = np.dot(a, b)  # 矩阵乘法

rand = np.random.random((2, 4))  # 随机矩阵

print(np.sum(a, axis=0))  # 行相加,axis理解为shape的索引
np.min(rand)
np.max(rand)

基础运算(二)

a = np.arange(2, 14).reshape((3, 4))
b = np.random.random((3, 4))

print(a)
print(np.argmax(a))  # 返回最大值索引
print(np.argmin(a))
print(np.average(a))  # 平均值

print(np.cumsum(a))  # 前缀和
print(np.diff(a))  # 一阶差分
print(np.nonzero(a))

print(np.clip(a, 5, 9))  # 将元素限制在[5,9]

索引和迭代

a = np.arange(3, 15).reshape((3, 4))

print(a[2, 1])  # 第二行第一列元素
print(a[:, 1])  # 第一列元素

for row in a:
    print(row)

for col in a.T:
    print(col)

for item in a.flat:  # 遍历每个元素
    print(item)

合并和分割

a = np.array([1, 1, 1])
b = np.array([2, 2, 2])

print(a[:, np.newaxis])  # 把1维的行向量变成2维列向量

print(np.vstack((a, b)))  # 上下合并
print(np.hstack((a, b)))  # 左右合并

a = np.arange(12).reshape((3, 4))


print(np.split(a, 2, axis=1))  # 纵向等分为2部分
print(np.array_split(a, 3, axis=1))  # 纵向不等分为3部分




Pandas

如果说numpy相当于一个list,那么Pandas就相当于一个dict

简单来说,当数据的维度比较大的时候,单纯地通过numpy中的数字索引来访问元素显得有些意义不明,我们希望给某一行,某一列甚至某个单元的元素一个名称,简化操作的同时丰富每一行的代码的语义和可读性,这就是Pandas

基本操作

在学习基本操作之前,我们必须明确的一点是:

一般来说,使用矩阵组织数据的是以行为单元的,什么意思呢?就是多组结构一致的数据往往表现在矩阵里是多行。因此从列的角度看每一列是多组数据的同一类型数据。这也是为什么在Pandas里行方向的labels称作index,因为它跟一般意义的索引没有本质区别,都是表示数据的序号

Pandas中最常用的两种数据类型是:Series和DataFrame

import pandas as pd
import numpy as np

s = pd.Series([1, 3, 6, 7, 44, np.nan, 3.4], index=[7]*7)  # 相当于一维的ndarray加上标签

data = pd.DataFrame(np.arange(12).reshape(
    (3, 4)), index=np.arange(3), columns=['a', 'b', 'c', 'd'])
# 相当于矩阵加上行标签和列标签,index表示行标签,columns表示列标签

print(data.index)  # 行labels
print(data.columns)  # 列labels
print(data.values)

print(data.describe())  # 按列输出统计数据

data = data.sort_index(axis=0, ascending=False)  # 对行labels排序,从大到小

data = data.sort_values(by='a', axis=0)  # 指定列labels按行排序

数据选择及更改

dates = pd.date_range('20190329', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6, 4)),
                  index=dates, columns=['a', 'b', 'c', 'd'])

print(df['a'], df.a, sep='\n')  # 输出标签为'a‘的列
print(df[0:3], df['20190329':'20190331'], sep='\n')  # 输出前三行数据


print(df.loc['20190329'])
print(df.loc[:, ['a', 'b']])   # loc基于标签名


print(df.iloc[3:5, 1:3])  # iloc基于行列的绝对数字(index)

print(df[df.a > 8])  # 筛选出a大于8的行

# 更改数据
df.iloc[2, 2] = 111
df.loc['20190329', 'b'] = 333
df.a[df.a > 4] = 0  # 把大于4的a列赋值为0
df['f'] = np.nan  # 动态添加新列

处理丢失数据

dates = pd.date_range('20190329', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6, 4)),
                  index=dates, columns=['a', 'b', 'c', 'd'])


df.iloc[0, 1] = np.nan
df.iloc[1, 2] = np.nan

print(df.fillna(value=0))  # 填充nan为0
print(df.dropna(axis=0, how='any'))  # 丢失存在nan的行


print(df.isnull())  # nan的位置为True,其余为False
print(np.any(df.isnull()) == True)  # 判断整个矩阵是否存在nan

简单IO

data = pd.read_csv('data.csv', sep=',')

pd.to_pickle(data, 'data.pickle')

data = pd.read_pickle('data.pickle')

合并

import pandas as pd
import numpy as np


# concat

df1 = pd.DataFrame(np.ones((3, 4))*0, columns=['a', 'b', 'c', 'd'])
df2 = pd.DataFrame(np.ones((3, 4))*1, columns=['a', 'b', 'c', 'd'])
df3 = pd.DataFrame(np.ones((3, 4))*2, columns=['a', 'b', 'c', 'd'])

print(df1, df2, df3, sep='\n\n')

res = pd.concat([df1, df2, df3], axis=0,
                ignore_index=True, join='inner')  # 按行合并(即纵向),index重新计算
# inner模式删去非公共的列标签对应的列,outer则会保留,同时用nan填充


res = res.append(pd.Series([0, 1, 2, 3], index=[
    'a', 'b', 'c', 'd']), ignore_index=True)  # 添加一个Series


# 基于key的合并请参考merge函数,和sql中的内外连接非常相似,此处不赘述各参数的用法,需要时查询文档即可
pd.merge()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容

  • 基础篇NumPy的主要对象是同种元素的多维数组。这是一个所有的元素都是一种类型、通过一个正整数元组索引的元素表格(...
    oyan99阅读 5,098评论 0 18
  • 为什么是 NumPy? 数据分析的基础是数据,原始数据应该在计算机中会以某种数据结构进行存储,后续的分析操作都是在...
    Clemente阅读 621评论 0 2
  • 一、Numpy & Pandas 简介 主要应用领域:数据分析,机器学习,深度学习 运行速度快:两者都是基于C语言...
    火禾子_阅读 515评论 0 0
  • 前言 numpy是支持 Python语言的数值计算扩充库,其拥有强大的高维度数组处理与矩阵运算能力。除此之外,nu...
    TensorFlow开发者阅读 3,184评论 0 35
  • pandas入门 简介 pandas包含的数据结构和操作工具能快速简单地清洗和分析数据。 pandas经常与Num...
    python测试开发阅读 2,371评论 1 16