Pandas学习笔记

Pandas是一个Python包,提供快速、灵活和富有表现力的数据结构,使关联或标记数据的使用既简单又直观。html

它旨在成为Python中进行实际,真实世界数据分析的基础高级构建块。这次外还有更普遍的目标,即称为任何语言中最强大,最灵活的开源数据分析/操做工具。数组

适合许多不一样类型的数据数据结构

  • 具备异构类型列的表格数据,如SQL表或Excel表
  • 有序和无序的时间序列数据
  • 具备行和列标签的任意矩阵数据
  • 任何其余形式的观察/统计数据集。实际上不须要将数据标记为放置在pandas数据结构中

主要数据结构是Series(一维)和DataFrame(二维)处理金融,统计,社会科学和许多工程领域中的绝大多数典型用例。Pandas创建在NumPy之上,与许多其余第三方库完美集成。dom

数据结构

数据对齐是固有的函数

  • import numpy as np
  • import pandas as pd
  • import matplotlib.pyplot as plt

Series是一维标记的数组,可以保存任何数据类型。轴标签统称为索引,建立系列的基本方法是调用工具

  • s = pd.Series(data,index=index)

data能够有不少不一样的东西,好比spa

  • 一个Python字典
  • 一个ndarray
  • 标量 

传递的索引是轴标签列表。所以根据数据的不一样,能够分为几种状况code

来自ndarrayhtm

若是data是ndarray,则索引的长度必须与数据的长度相同。若是没有传递索引,将建立一个具备值的索引对象

pd.Series(np.random.rand(5))

来自dict

能够从dicts实例化

pd.Series({'b':1}) 

来自标量值

若是data是标量值,则必须提供索引。将重复该值以匹配索引的长度

pd.Series(5.,index=['a','b']) 

index是行索引,columns是列索引

能够对Series进行计算和切片等操做

系列也能够有一个name属性

s = pd.Series(np.random.randn(5),name='something')

DataFrame是一个二维标记数据结构,具备可能不一样类型的列。能够将其视为电子表格或SQL表,或Series对象的字段。一般是最经常使用的pandas对象。接受不一样类型的输入

  • 1D ndarray,list,dicts或Series的Dict
  • 二维numpy.ndarray
  • 结构化或记录ndarray
  • 一个Series
  • 另外一个DataFrame

除了数据,还能够传递索引(行标签)和列(列标签)参数。若是传递索引和/或列,则能够保证生成的DataFrame的索引和/或列。

来自dict或Series的dicts

获得的指数将是各类系列的指标。若是有任何嵌套的dicts,将首先转换为Series。

In [34]: d = {'one' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']), ....: 'two' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])} ....: In [35]: df = pd.DataFrame(d) In [36]: df Out[36]: one two a 1.0  1.0 b 2.0  2.0 c 3.0  3.0 d NaN 4.0 In [37]: pd.DataFrame(d, index=['d', 'b', 'a']) Out[37]: one two d NaN 4.0 b 2.0  2.0 a 1.0  1.0 In [38]: pd.DataFrame(d, index=['d', 'b', 'a'], columns=['two', 'three']) Out[38]: two three d 4.0 NaN b 2.0 NaN a 1.0   NaN

经过访问索引和列数据,能够分别访问行和列标签

In [39]: df.index Out[39]: Index(['a', 'b', 'c', 'd'], dtype='object') In [40]: df.columns Out[40]: Index(['one', 'two'], dtype='object')

来自ndarrays 、lists的字典

ndarrays必须都是相同的长度。若是传递索引,则它必须明显与数组的长度相同。若是没有传递索引,结果将是range(n)

In [41]: d = {'one' : [1., 2., 3., 4.], ....: 'two' : [4., 3., 2., 1.]} ....: In [42]: pd.DataFrame(d) Out[42]: one two 0  1.0  4.0
1  2.0  3.0
2  3.0  2.0
3  4.0  1.0 In [43]: pd.DataFrame(d, index=['a', 'b', 'c', 'd']) Out[43]: one two a 1.0  4.0 b 2.0  3.0 c 3.0  2.0 d 4.0  1.0

来自structrued或record array

处理方式与数组的字段相同

In [44]: data = np.zeros((2,), dtype=[('A', 'i4'),('B', 'f4'),('C', 'a10')]) In [45]: data[:] = [(1,2.,'Hello'), (2,3.,"World")] In [46]: pd.DataFrame(data) Out[46]: A B C 0  1  2.0  b'Hello'
1  2  3.0  b'World' In [47]: pd.DataFrame(data, index=['first', 'second']) Out[47]: A B C first 1  2.0  b'Hello' second 2  3.0  b'World' In [48]: pd.DataFrame(data, columns=['C', 'A', 'B']) Out[48]: C A B 0  b'Hello'  1  2.0
1  b'World'  2  3.0

来自dicts列表

In [49]: data2 = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}] In [50]: pd.DataFrame(data2) Out[50]: a b c 0  1   2 NaN 1  5  10  20.0 In [51]: pd.DataFrame(data2, index=['first', 'second']) Out[51]: a b c first 1   2 NaN second 5  10  20.0 In [52]: pd.DataFrame(data2, columns=['a', 'b']) Out[52]: a b 0  1   2
1  5  10

来自元组

In [53]: pd.DataFrame({('a', 'b'): {('A', 'B'): 1, ('A', 'C'): 2}, ....: ('a', 'a'): {('A', 'C'): 3, ('A', 'B'): 4}, ....: ('a', 'c'): {('A', 'B'): 5, ('A', 'C'): 6}, ....: ('b', 'a'): {('A', 'C'): 7, ('A', 'B'): 8}, ....: ('b', 'b'): {('A', 'D'): 9, ('A', 'B'): 10}}) ....: Out[53]: a b b a c a b A B 1.0  4.0  5.0  8.0  10.0 C 2.0  3.0  6.0  7.0 NaN D NaN NaN NaN NaN 9.0

构造函数

DataFrame.from_dict采用dicts的dict或相似数组序列的dict并返回DataFrame。DataFrame除了默认状况下的orient参数外,它的操做相似于构造函数columns,但能够将其设置index为使用dict键做为行标签

In [54]: pd.DataFrame.from_dict(dict([('A', [1, 2, 3]), ('B', [4, 5, 6])])) Out[54]: A B 0  1  4
1  2  5
2  3  6

若是设置orient='index',则键将是行标签。还能够传递所需的列名称

In [55]: pd.DataFrame.from_dict(dict([('A', [1, 2, 3]), ('B', [4, 5, 6])]), ....: orient='index', columns=['one', 'two', 'three']) ....: Out[55]: one two three A 1    2      3 B 4    5      6

DataFrame.from_record获取元组列表或带有结构化dtype的ndarray。相似于普通DataFrame构造函数,但生产的DataFrame索引多是结构化dtype的特定字段

In [57]: pd.DataFrame.from_records(data, index='C') Out[57]: A B C b'Hello'  1  2.0 b'World'  2  3.0

列选择、添加、删除

能够将DataFrame视为相似索引的Series对象的dict。获取,设置和删除的工做方式与dict操做相同

In [58]: df['one'] Out[58]: a 1.0 b 2.0 c 3.0 d NaN Name: one, dtype: float64 In [59]: df['three'] = df['one'] * df['two'] In [60]: df['flag'] = df['one'] > 2 In [61]: df Out[61]: one two three flag a 1.0  1.0    1.0 False b 2.0  2.0    4.0 False c 3.0  3.0    9.0 True d NaN 4.0    NaN  False

删除

In [62]: del df['two'] In [63]: three = df.pop('three') In [64]: df Out[64]: one flag a 1.0 False b 2.0 False c 3.0 True d NaN False

插入

In [65]: df['foo'] = 'bar' In [66]: df Out[66]: one flag foo a 1.0 False bar b 2.0 False bar c 3.0 True bar d NaN False bar

若是插入与DataFrame不具备相同索引的Series时,将符合DataFrame的索引

In [67]: df['one_trunc'] = df['one'][:2] In [68]: df Out[68]: one flag foo one_trunc a 1.0  False  bar        1.0 b 2.0  False  bar        2.0 c 3.0 True bar NaN d NaN False bar NaN

能够插入原始的ndarrays,但他们的长度必须与DataFrame索引的长度相匹配

默认状况下,列会在末尾插入。该insert函数能够用于插入列的特定位置

In [69]: df.insert(1, 'bar', df['one']) In [70]: df Out[70]: one bar flag foo one_trunc a 1.0  1.0  False  bar        1.0 b 2.0  2.0  False  bar        2.0 c 3.0  3.0 True bar NaN d NaN NaN False bar NaN

在方法链中分配新列

DataFrame有一种assign()方法能够建立从现有列派生的新列

In [71]: iris = pd.read_csv('data/iris.data') In [72]: iris.head() Out[72]: SepalLength SepalWidth PetalLength PetalWidth Name 0          5.1         3.5          1.4         0.2  Iris-setosa 1          4.9         3.0          1.4         0.2  Iris-setosa 2          4.7         3.2          1.3         0.2  Iris-setosa 3          4.6         3.1          1.5         0.2  Iris-setosa 4          5.0         3.6          1.4         0.2  Iris-setosa In [73]: (iris.assign(sepal_ratio = iris['SepalWidth'] / iris['SepalLength']) ....: .head()) ....: Out[73]: SepalLength SepalWidth PetalLength PetalWidth Name sepal_ratio 0          5.1         3.5          1.4         0.2  Iris-setosa       0.6863
1          4.9         3.0          1.4         0.2  Iris-setosa       0.6122
2          4.7         3.2          1.3         0.2  Iris-setosa       0.6809
3          4.6         3.1          1.5         0.2  Iris-setosa       0.6739
4          5.0         3.6          1.4         0.2  Iris-setosa       0.7200

咱们插入了一个预先计算的值,还能够传入一个参数的函数,以便在分配给DataFrame上进行求值

In [74]: iris.assign(sepal_ratio = lambda x: (x['SepalWidth'] / ....: x['SepalLength'])).head() ....: Out[74]: SepalLength SepalWidth PetalLength PetalWidth Name sepal_ratio 0          5.1         3.5          1.4         0.2  Iris-setosa       0.6863
1          4.9         3.0          1.4         0.2  Iris-setosa       0.6122
2          4.7         3.2          1.3         0.2  Iris-setosa       0.6809
3          4.6         3.1          1.5         0.2  Iris-setosa       0.6739
4          5.0         3.6          1.4         0.2  Iris-setosa       0.7200

assign始终返回数据的副本,保持原始DataFrame不变

当没有引用DataFrame时,传递可调用的,而不是要插入的实际值。这assign在操做链中使用时很常见

In [75]: (iris.query('SepalLength > 5') ....: .assign(SepalRatio = lambda x: x.SepalWidth / x.SepalLength, ....: PetalRatio = lambda x: x.PetalWidth / x.PetalLength) ....: .plot(kind='scatter', x='SepalRatio', y='PetalRatio'))

索引选择

选择列:df[col]:系列

按标签选择行:df.loc[label]:系列

按整数位置选择行:df.iloc[loc]:系列

切片行:df[5:10]:数据帧

按布尔向量选择行:df[bool_vec]:数据帧

数据对齐和算术

DataFrame对象之间的数据对其自动在列和索引(行标签)上对齐。一样生成的对象具备列和行标签的并集

In [82]: df = pd.DataFrame(np.random.randn(10, 4), columns=['A', 'B', 'C', 'D']) In [83]: df2 = pd.DataFrame(np.random.randn(7, 3), columns=['A', 'B', 'C']) In [84]: df + df2 Out[84]: A B C D 0  0.0457 -0.0141  1.3809 NaN 1 -0.9554 -1.5010  0.0372 NaN 2 -0.6627  1.5348 -0.8597 NaN 3 -2.4529  1.2373 -0.1337 NaN

DataFrame和Series之间执行操做时,默认行为是在DataFrame列上对齐Series索引,从而按行进行广播

df - df.iloc[0]

 在使用时间序列数据的特殊状况下,DataFrame索引还包含日期,广播将按列进行

index = pd.date_range('1/1/2000', periods=8)
df = pd.DataFrame(np.random.randn(8, 3), index=index, columns=list('ABC'))
df*5+2
1/df
df ** 4
df1 & df2
df1 | df2
df1 ^ df2
-df1

转置

要进行转置,须要访问T属性,相似于ndarray

df[:5].T

DataFrame与NumPy函数的互操做性

能够在DataFrame上使用其余的Numpy函数

np.exp(df)

np.asarray(df)

df.T.dot(df)

DataFrame列属性访问

若是DataFrame列标签是有效的Python变量名称,则能够像属性同样访问

df.A

基本功能

要查看Series或DataFrame对象的小样本,请使用head()和tail()方法。显示的默认元素数为5,但您能够传递自定义数字。

long_series = pd.Series(np.random.randn(100))

long_series.head() //查看头

long_series.tail(3) //查看末尾

属性和原始ndarray(s)

df.columns = [x.lower() for x in df.columns] //列名小写

df.values 访问实际数据

加速操做

pandas支持使用numexpr库和bottleneck库加速某些类型的二进制数值和布尔运算

pd.set_option('compute.use_bottleneck', False) pd.set_option('compute.use_numexpr', False)

匹配和广播

数据框所拥有的方法add(),sub(),mul(),div()和相关的功能radd(),rsub()用于执行二进制运算。

对于广播行为,系列输入是主要关注点。能够经过axis关键字匹配索引或列。

填充值数据的操做

算术函数能够选择输入fill_value,即当缺乏某个位置时须要替换的值。

df.add(df2,fill_value=0)

布尔缩减

能够使用empty,any(),all,bool()提供一种方法来归纳一个布尔结果

  • (df>0).all()
  • (df>0).any()
  • df.empty

比较对象是否相等

df+df != df*2 这个表达式是错误的 

(df+df).equals(df*2) 应该使用这个表达式

比较相似数组的对象

pandas数据结构与标量值进行比较时,能够用下面方式执行元素比较 

In [64]: pd.Series(['foo', 'bar', 'baz']) == 'foo' Out[64]: 0 True 1 False 2 False dtype: bool In [65]: pd.Index(['foo', 'bar', 'baz']) == 'foo' Out[65]: array([ True, False, False], dtype=bool)

pandas还处理相同长度的不一样数组对象之间的元素比较

In [66]: pd.Series(['foo', 'bar', 'baz']) == pd.Index(['foo', 'bar', 'qux']) Out[66]: 0 True 1 True 2 False dtype: bool In [67]: pd.Series(['foo', 'bar', 'baz']) == np.array(['foo', 'bar', 'qux']) Out[67]: 0 True 1 True 2 False dtype: bool

尝试比较Index或Series不一样长度的对象将引起ValueError

注意:这个和NumPy的广播不同

组合重叠数据集

两个类似数据集的组合,其中一个比较好。咱们但愿组合两个DataFrame对象,其中一个DataFrame中的缺失值有条件地填充来自其余DataFrame的相似标记的值。实现操做的函数是combine_first(),如同位置两边都存在则使用第一个。

In [70]: df1 = pd.DataFrame({'A' : [1., np.nan, 3., 5., np.nan], ....: 'B' : [np.nan, 2., 3., np.nan, 6.]}) ....: In [71]: df2 = pd.DataFrame({'A' : [5., 2., 4., np.nan, 3., 7.], ....: 'B' : [np.nan, np.nan, 3., 4., 6., 8.]}) ....: In [72]: df1 Out[72]: A B 0  1.0 NaN 1  NaN  2.0
2  3.0  3.0
3  5.0 NaN 4  NaN  6.0 In [73]: df2 Out[73]: A B 0  5.0 NaN 1  2.0 NaN 2  4.0  3.0
3  NaN  4.0
4  3.0  6.0
5  7.0  8.0 In [74]: df1.combine_first(df2) Out[74]: A B 0  1.0 NaN 1  2.0  2.0
2  3.0  3.0
3  5.0  4.0
4  3.0  6.0
5  7.0  8.0

通用DataFrame组合

另外一个DataFrame和组合器函数,对齐输入DataFrame,而后传递Series的组合器函数对(名称相同的列)

In [75]: combiner = lambda x, y: np.where(pd.isna(x), y, x) In [76]: df1.combine(df2, combiner)

描述性统计

 

 

 

 

 

 

 

 

 

 

 

 

 

http://pandas.pydata.org/pandas-docs/stable/basics.html

相关文章
相关标签/搜索