pandas入门 02 数据结构

import numpy as np
import pandas as pd

0 pandas数据结构简介

pandas主要处理下面三种数据结构

  • Series
  • DataFrame
  • Panel

它们都是以numpy为基础的,处理速度相对较快,其中最常用的是DataFrame

数据结构 维数 简述
Series 1 1维数组,大小不可变,但是里边的值可变
DataFrame 2 2维数组,大小可变
Panel 3 3维数组,大小可变

接下来详细介绍这三种数据结构

1 Series

Series是一个可以保存任何类型的数据的一维标签数组,标签被称之为index

1.1 构造函数

pandas.Series(data, index, dtype, copy)

构造函数参数如下:

参数 描述
data 数据,例如ndarray、list等
index 索引值必须保证唯一并可散列,与数据长度相同。默认使用np.arange(n)
dtype 数据类型
copy 复制数据,默认为False

1.2 创建Series

1.2.1 创建空Series

s = pd.Series()
print s
Series([], dtype: float64)

1.2.2 从list创建Series

使用默认的index使用默认index,如下所示

s = pd.Series([1, 3, 5, np.nan, 6, 8])
print s
0    1.0
1    3.0
2    5.0
3    NaN
4    6.0
5    8.0
dtype: float64

1.2.3 从np.ndarray中创建Series

给定一个相同长度的index,如下所示

s = pd.Series(np.random.rand(5), index=["a", "b", "c", "d", "e"])
print s
a    0.055684
b    0.697289
c    0.768223
d    0.428101
e    0.748015
dtype: float64
print s.index
Index([u'a', u'b', u'c', u'd', u'e'], dtype='object')

1.2.4 从dict创建Series

如果没有指定index,则按照字典顺序获取dict中的健作为index。如果指定了index,则按照指定的index从dict中获取索引对应的值。

d = {"a": 0., "b": 1., "c": 2.}
s = pd.Series(d)
print s

s = pd.Series(d, index=["b", "c", "d", "a"])
print s
a    0.0
b    1.0
c    2.0
dtype: float64
b    1.0
c    2.0
d    NaN
a    0.0
dtype: float64

1.2.5 从标量中创建Series

使用这种方式必须指定index,如下所示:

s = pd.Series(5., index=["a", "b", "c", "d", "e"])
print s
a    5.0
b    5.0
c    5.0
d    5.0
e    5.0
dtype: float64

1.3 类ndarray访问Series

Seriesnp.ndarray非常相似,可以使用大部分NumPy中的大部分方法或者方式来操作和访问Series,如下所示:

s = pd.Series(np.random.rand(5), index=["a", "b", "c", "d", "e"])

print s
a    0.566958
b    0.548278
c    0.239546
d    0.218399
e    0.322169
dtype: float64
print s[0]
0.566958376402
print s[:3]
a    0.566958
b    0.548278
c    0.239546
dtype: float64
print s[s>s.median()]
a    0.566958
b    0.548278
dtype: float64
print s[[4, 3, 1]]
e    0.322169
d    0.218399
b    0.548278
dtype: float64
print np.exp(s)
a    1.762897
b    1.730271
c    1.270672
d    1.244083
e    1.380118
dtype: float64
print s + s
a    1.133917
b    1.096556
c    0.479092
d    0.436798
e    0.644338
dtype: float64
print s * 2
a    1.133917
b    1.096556
c    0.479092
d    0.436798
e    0.644338
dtype: float64

1.4 类dict访问Series

可以通过类似dict的方式访问Series,如下所示

print s["a"]
0.566958376402
print "e" in s
True
print "f" in s
False
print s.get("e")
print s.get("f", np.nan)
0.322169102265
nan

2 DataFrame

DataFrame是一个二维数组结构,通过行index和列columns来访问其中的数据。

2.1 构造函数

pandas.DataFrame(data, index, columns, dtype, copy)

构造函数参数如下:

参数 描述
data 数据,例如2-D ndarray、lists、Series、dict或者其他DataFrame等
index 对应于行标签不一定唯一,与数据长度相同。默认使用np.arange(n)
columns 对应于列标签必须保证唯一并可散列。默认使用np.arange(n)
dtype 数据类型
copy 复制数据,默认为False

2.2 创建DataFrame

2.2.1 从value是Series或者dicts的字典创建

DataFrame的index是所有Series中的indexes的并集。如果value是一个dict,首先将其转换成Series。如果没有指定columns,则使用dict中的所有keys作为columns。如下所示:

d = {"one": pd.Series([1., 2., 3.], index=["a", "b", "c"]),
    "two": pd.Series([1., 2., 3., 4.], index=["a", "b", "c", "d"])}

df = pd.DataFrame(d)
print df
   one  two
a  1.0  1.0
b  2.0  2.0
c  3.0  3.0
d  NaN  4.0
df1 = pd.DataFrame(d, index=["d", "b", "a"])
print df1
   one  two
d  NaN  4.0
b  2.0  2.0
a  1.0  1.0
df2 = pd.DataFrame(d, index=["d", "b", "a"], columns=["two", "three"])
print df2
   two three
d  4.0   NaN
b  2.0   NaN
a  1.0   NaN

2.2.2 从value是ndarrays或者list的字典中创建

d = {"one": [1., 2., 3., 4.],
    "two": [4., 3., 2., 1.]}

df = pd.DataFrame(d)
print df
   one  two
0  1.0  4.0
1  2.0  3.0
2  3.0  2.0
3  4.0  1.0
df1 = pd.DataFrame(d, index=["a", "b", "c", "d"])
print df1
   one  two
a  1.0  4.0
b  2.0  3.0
c  3.0  2.0
d  4.0  1.0

2.2.3 从结构化的array中创建

data = np.zeros((2,), dtype=[("A", "i4"), ("B", "f4"), ("C", "a10")])
data[:] = [(1, 2., "Hello"), (2, 3., "World")]

df1 = pd.DataFrame(data)
print df1
   A    B      C
0  1  2.0  Hello
1  2  3.0  World
df2 = pd.DataFrame(data, index=["first", "second"])
print df2
        A    B      C
first   1  2.0  Hello
second  2  3.0  World
df3 = pd.DataFrame(data, columns=["C", "A", "B"])
print df3
       C  A    B
0  Hello  1  2.0
1  World  2  3.0

2.2.4 从元素是dict的list中创建

data = [{"a": 1, "b": 2}, {"a": 5, "b": 10, "c": 20}]

df1 = pd.DataFrame(data)
print df1
   a   b     c
0  1   2   NaN
1  5  10  20.0
df2 = pd.DataFrame(data, columns=["a", "b"])
print df2
   a   b
0  1   2
1  5  10

2.2.5 从列表中创建

data = [1,2,3,4,5]

df = pd.DataFrame(data)
print df
   0
0  1
1  2
2  3
3  4
4  5
data = [['Alex',10],['Bob',12],['Clarke',13]]

df = pd.DataFrame(data,columns=['Name','Age'])
print df
     Name  Age
0    Alex   10
1     Bob   12
2  Clarke   13

2.3 列选择,添加和删除

通过column获取指定列

d = {"one": pd.Series([1., 2., 3.], index=["a", "b", "c"]),
    "two": pd.Series([1., 2., 3., 4.], index=["a", "b", "c", "d"])}

df = pd.DataFrame(d)

print df["one"]
a    1.0
b    2.0
c    3.0
d    NaN
Name: one, dtype: float64

添加列

df["three"] = df["one"] * df["two"]  #由其他列计算而来
df["flag"] = df["one"] > 2           #有其他列计算而来
df["foo"] = "bar"                    #全部赋值为bar
df.insert(1, "bar", df["one"])       #在固定位置添加列
print df
   one  bar  two  three   flag  foo
a  1.0  1.0  1.0    1.0  False  bar
b  2.0  2.0  2.0    4.0  False  bar
c  3.0  3.0  3.0    9.0   True  bar
d  NaN  NaN  4.0    NaN  False  bar

删除列

del df["two"]

three = df.pop("three")

print df
   one  bar   flag  foo
a  1.0  1.0  False  bar
b  2.0  2.0  False  bar
c  3.0  3.0   True  bar
d  NaN  NaN  False  bar

2.4 行选择,添加和删除

可以通过如下方式选择df中的某一行或者多行:

方式 操作 结果
df.loc[label] 通过行标签选择 Series
df.iloc[loc] 通过整数索引选择 Series
df[5:10] 通过下标选取多行 DataFrame
df[bool_vec] 通过boolean数组选取多行 DataFrame
df = pd.DataFrame(np.random.randn(10, 4), index=list("abcdefghij"), columns=["A", "B", "C", "D"])
print df
          A         B         C         D
a -0.986619  1.526696 -0.268968 -0.092091
b -1.151455 -0.512284 -0.978782  1.043218
c  0.909876 -1.032838 -0.103740 -0.002227
d -1.012738  0.519562  1.472160 -0.334393
e -0.833450  0.402912 -0.586269 -1.501751
f  0.039272  0.759840 -0.688571 -0.686812
g  0.641397  0.162648 -0.969303  1.060234
h -0.119458  0.059383 -1.328667 -0.777637
i  0.093021 -0.235605  0.166218 -0.582874
j  0.462327 -0.435135 -1.953918  0.531841

行选择

print df.loc["b"]
A   -1.151455
B   -0.512284
C   -0.978782
D    1.043218
Name: b, dtype: float64
print df.iloc[2]
A    0.909876
B   -1.032838
C   -0.103740
D   -0.002227
Name: c, dtype: float64
print df[2:4]
          A         B        C         D
c  0.909876 -1.032838 -0.10374 -0.002227
d -1.012738  0.519562  1.47216 -0.334393
print df[[False, True, False, True, False, True, False, False, True, False]]
          A         B         C         D
b -1.151455 -0.512284 -0.978782  1.043218
d -1.012738  0.519562  1.472160 -0.334393
f  0.039272  0.759840 -0.688571 -0.686812
i  0.093021 -0.235605  0.166218 -0.582874

附加行

df2 = pd.DataFrame(np.random.randn(2, 4), index=["m", "n"], columns=["A", "B", "C", "D"])
df = df.append(df2)
print df
          A         B         C         D
a -0.986619  1.526696 -0.268968 -0.092091
b -1.151455 -0.512284 -0.978782  1.043218
c  0.909876 -1.032838 -0.103740 -0.002227
d -1.012738  0.519562  1.472160 -0.334393
e -0.833450  0.402912 -0.586269 -1.501751
f  0.039272  0.759840 -0.688571 -0.686812
g  0.641397  0.162648 -0.969303  1.060234
h -0.119458  0.059383 -1.328667 -0.777637
i  0.093021 -0.235605  0.166218 -0.582874
j  0.462327 -0.435135 -1.953918  0.531841
m  1.004950  0.522191 -0.071558 -0.615419
n -0.995826 -1.055260 -1.204035 -1.444035

删除行

df = df.drop("a")
print df
          A         B         C         D
b -1.151455 -0.512284 -0.978782  1.043218
c  0.909876 -1.032838 -0.103740 -0.002227
d -1.012738  0.519562  1.472160 -0.334393
e -0.833450  0.402912 -0.586269 -1.501751
f  0.039272  0.759840 -0.688571 -0.686812
g  0.641397  0.162648 -0.969303  1.060234
h -0.119458  0.059383 -1.328667 -0.777637
i  0.093021 -0.235605  0.166218 -0.582874
j  0.462327 -0.435135 -1.953918  0.531841
m  1.004950  0.522191 -0.071558 -0.615419
n -0.995826 -1.055260 -1.204035 -1.444035

2.5 转置

df_t = df.T
print df_t
          b         c         d         e         f         g         h  \
A -1.151455  0.909876 -1.012738 -0.833450  0.039272  0.641397 -0.119458   
B -0.512284 -1.032838  0.519562  0.402912  0.759840  0.162648  0.059383   
C -0.978782 -0.103740  1.472160 -0.586269 -0.688571 -0.969303 -1.328667   
D  1.043218 -0.002227 -0.334393 -1.501751 -0.686812  1.060234 -0.777637   

          i         j         m         n  
A  0.093021  0.462327  1.004950 -0.995826  
B -0.235605 -0.435135  0.522191 -1.055260  
C  0.166218 -1.953918 -0.071558 -1.204035  
D -0.582874  0.531841 -0.615419 -1.444035  

3 Panel

用的不多,暂不介绍,待后续补充

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

推荐阅读更多精彩内容