pandas入门 02 数据结构

这篇博客介绍了pandas的三大数据结构:Series、DataFrame和Panel。重点讲解了Series的构造函数和创建方法,包括创建空Series、从各种源创建,以及其类ndarray和类dict的访问方式。接着详细阐述了DataFrame的构造、创建、列选择、添加和删除,以及转置操作。Panel部分则简单提及,表示后续会补充。
摘要由CSDN通过智能技术生成
import numpy as np
import pandas as pd

0 pandas数据结构简介

pandas主要处理下面三种数据结构
* Series
* DataFrame
* Panel

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

数据结构维数简述
Series11维数组,大小不可变,但是里边的值可变
DataFrame22维数组,大小可变
Panel33维数组,大小可变

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值