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
Series
与np.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
用的不多,暂不介绍,待后续补充