数据分析利器Pandas基本功能


概述

pandas是基于Numpy构建的,让处理数据、分析数据和可视化数据都会变得更加简单,官网Pandas.正如官网所说:

pandas is an open source, BSD-licensed library providing high-performance, easy-to-use data structures and data analysis tools for the Python programming language.

Pandas 数据结构

pandas中最主要的数据结构是Series和DataFrame。Series是一种类似numpy的一维数组对象,它由一组数据和数据标签(索引)组成.

Series

在使用Series之前需要安装pandas的类库,通过pip即可以安装pandas。

pip install pandas

然后通过python导入即可。

In [3]: from pandas import (Series,DataFrame)
In [4]: import pandas as pd
In [5]: test = Series([1,2,3,-6])
In [6]: test
Out[6]:
0    1
1    2
2    3
3   -6
dtype: int64

最左边的是数据的索引,右边是数据的值,dtype代表数据的存储的格式。正如上面看到的,如果我们没有初始化一个index数组时,Series会自动创建一个从整数索引。如果获取Series的值和索引呢?

In [7]: test.values
Out[7]: array([ 1,  2,  3, -6])
In [8]: test.index
Out[8]: RangeIndex(start=0, stop=4, step=1)

我们看一下Series的参数和说明:

Init signature: Series(self, data=None, index=None, dtype=None, name=None, copy=False, fastpath=False)

Parameters data : array-like, dict, or scalar value Contains data stored in Series index : array-like or Index (1d) Values must be unique and hashable, same length as data. Index object (or other iterable of same length as data) Will default to RangeIndex(len(data)) if not provided. If both a dict and index sequence are used, the index will override the keys found in the dict. dtype : numpy.dtype or None If None, dtype will be inferred copy : boolean, default False Copy input data File: /usr/local/lib/python2.7/site-packages/pandas/core/series.py Type: type

Series操作

In [19]: test = Series([-2,3,4,-10],index=['a','b','c','d'])
In [20]: test[['a','c']]
Out[20]:
a   -2
c    4
dtype: int64
In [21]: test[test>0]
Out[21]:
b    3
c    4
dtype: int64
In [22]: test*2
Out[22]:
a    -4
b     6
c     8
d   -20
dtype: int64
In [23]: 'a' in test
Out[23]: True

还可以把Series看做成一个字典,字典的key映射到index,字典的value映射到data。Series还会对不同字典的具有相同的key进行计算时,Serise会自动对齐索引。

In [29]: d = {'name':'brian','age':12}
In [30]: test = Series(d)
In [31]: test
Out[31]:
age        12
name    brian
dtype: object
In [32]: c = {'a':12,'b':23,'c':24}
In [33]: test1 = Series(c)
In [34]: test1
Out[34]:
a    12
b    23
c    24
dtype: int64
In [35]: d=['a','c','b','d']
In [36]: test2 = Series(c,index=d)
In [37]: test2
Out[37]:
a    12.0
c    24.0
b    23.0
d     NaN
dtype: float64
In [51]: test1+test2
Out[51]:
a    24.0
b    46.0
c    48.0
d     NaN
dtype: float64
In [56]: test1.index=['k','e','g']
In [57]: test1
Out[57]:
k    12
e    23
g    24
dtype: int64

在数据处理中经常对缺失或者NA值进行处理,pandas提供了isnull和notnull来检测null值,并通过fillna来填充为NaN的值。fillna中有一个method参数,里面可以按照很多方式去处理你的业务。在后面详细介绍。

In [40]: pd.isnull(test2)
Out[40]:
a    False
c    False
b    False
d     True
dtype: bool
In [41]: pd.notnull(test2)
Out[41]:
a     True
c     True
b     True
d    False
dtype: bool
In [43]: test2.fillna(22)
Out[43]:
a    12.0
c    24.0
b    23.0
d    22.0
dtype: float64

DataFrame

DataFrame是一个表格型的数据结构,你可以理解为一个多维的行列数据结构。可以进行面向行和面向列处理。DataFrame不仅包含了index还增加了Columns,因为这是一个多维结构。

DataFrame操作

In [60]: data = {'state':['oh','oh','oh','ne','ne'],'year':[2000,2001,2002,2001,2002],'pop':[1.5,1.7,3.6,2.4,2.9]}
In [61]: frame = DataFrame(data)
In [62]: frame
Out[62]:
   pop state  year
0  1.5    oh  2000
1  1.7    oh  2001
2  3.6    oh  2002
3  2.4    ne  2001
4  2.9    ne  2002

你也可以指定columns的顺序,如果你指定的Column不存在时默认用NaN填充。

In [64]: frame = DataFrame(data,columns=['year','state','pop','exit'],index=['a','b','c','d','k'])
In [65]: frame
Out[65]:
   year state  pop exit
a  2000    oh  1.5  NaN
b  2001    oh  1.7  NaN
c  2002    oh  3.6  NaN
d  2001    ne  2.4  NaN
k  2002    ne  2.9  NaN

DataFrame操作默认是面向列操作的,单列的数据操作对象你可以把它当成Series对象处理。

In [71]: frame['year']
Out[71]:
a    2000
b    2001
c    2002
d    2001
k    2002
Name: year, dtype: int64
In [72]: frame.ix['a']
Out[72]:
year     2000
state      oh
pop       1.5
exit      NaN
Name: a, dtype: object
In [75]: frame.ix[['a','b'],['year','pop']]
Out[75]:
   year  pop
a  2000  1.5
b  2001  1.7
In [77]: frame['exit']=16.5
In [78]: frame
Out[78]:
   year state  pop  exit
a  2000    oh  1.5  16.5
b  2001    oh  1.7  16.5
c  2002    oh  3.6  16.5
d  2001    ne  2.4  16.5
k  2002    ne  2.9  16.5

In [79]: ser = Series([12,23,4,4,5],index=['a','b','c','d','k'])
In [80]: frame['exit']=ser
In [81]: frame
Out[81]:
   year state  pop  exit
a  2000    oh  1.5    12
b  2001    oh  1.7    23
c  2002    oh  3.6     4
d  2001    ne  2.4     4
k  2002    ne  2.9     5

Pandas 功能

1.reindex,创建一个适应新索引的新对象。再重新生成reindex时如果不存在index可以采用fill_value来生成填充值。如果index是一个有序数据时可以通过method=”ffill(向前填充)/pad(向后搬运) bfill(向后填充)或backfill(向后搬运)”

Series reindex

In [11]: test = Series([1,2,3,4,5],index=['e','b','c','d','a'])
In [12]: test
Out[12]:
e    1
b    2
c    3
d    4
a    5
dtype: int64
In [13]: test1 = test.reindex(['a','b','k','g','h'],fill_value=0)
In [14]: test1
Out[14]:
a    5
b    2
k    0
g    0
h    0
dtype: int64
In [21]: test3 = Series([1,2,3,4,5],index=[2,4,7,8,9])
In [23]: test3.reindex(range(10),method='bfill')
Out[23]:
0    1
1    1
2    1
3    2
4    2
5    3
6    3
7    3
8    4
9    5
dtype: int64

Pandas reindex

In [36]: test = DataFrame(np.arange(16).reshape((4,4)),index=['a','b','c','d'],columns=['oh','te','ca','ka'])
In [37]: test
Out[37]:
   oh  te  ca  ka
a   0   1   2   3
b   4   5   6   7
c   8   9  10  11
d  12  13  14  15
In [38]: test1 = test.reindex(columns=['oh','ca','aa','ss'],fill_value=12)
In [39]: test1
Out[39]:
   oh  ca  aa  ss
a   0   2  12  12
b   4   6  12  12
c   8  10  12  12
d  12  14  12  12
In [40]: test1 = test.reindex(['d','a','b','c'])
In [41]: test1
Out[41]:
   oh  te  ca  ka
d  12  13  14  15
a   0   1   2   3
b   4   5   6   7
c   8   9  10  11

2.drop系列方法和常用操作

Series

In [42]: test = Series([1,1,2,np.nan],index=list("abcd"))
In [43]: test
Out[43]:
a    1.0
b    1.0
c    2.0
d    NaN
dtype: float64
In [44]: test.drop('a')
Out[44]:
b    1.0
c    2.0
d    NaN
dtype: float64
In [36]: test.dropna()
Out[36]:
a    1.0
b    1.0
c    2.0
dtype: float64
In [37]: test>5
Out[37]:
a    False
b    False
c    False
d    False
dtype: bool
In [38]: test>1
Out[38]:
a    False
b    False
c     True
d    False
dtype: bool

In [39]: test[test>1]
Out[39]:
c    2.0
dtype: float64

In [40]: test+2
Out[40]:
a    3.0
b    3.0
c    4.0
d    NaN
dtype: float64

In [55]: test = DataFrame({"key":[1,1,2,np.nan],"value":[2,1,2,4]})

In [56]: test
Out[56]:
   key  value
0  1.0      2
1  1.0      1
2  2.0      2
3  NaN      4
In [61]: test.drop(0)
Out[61]:
   key  value
1  1.0      1
2  2.0      2
3  NaN      4

In [58]: test.drop('key',axis=1)
Out[58]:
   value
0      2
1      1
2      2
3      4

Pandas 函数处理

pandas的函数处理一部分是顶级的函数pandas函数提供的。

add sub div mul

pandas顶级函数,所对应的操作是+、-、/ * 。比较简单自己实操。

apply and applymap

apply作用在行或者列,applymap作用在元素级别。

In [69]: test = DataFrame(np.arange(16).reshape((4,4)),columns=list("abcd"),index=list("kbgh"))
In [70]: test
Out[70]:
    a   b   c   d
k   0   1   2   3
b   4   5   6   7
g   8   9  10  11
h  12  13  14  15

In [71]: f = lambda x: x.max()-x.min()
In [72]: test.apply(f,axis=1)
Out[72]:
k    3
b    3
g    3
h    3
dtype: int64
In [73]: test.apply(f)
Out[73]:
a    12
b    12
c    12
d    12
dtype: int64
In [74]: def f(x):
    ...:     return Series([x.min(),x.max()],index=["min","max"])
    ...:
In [75]: test.apply(f)
Out[75]:
      a   b   c   d
min   0   1   2   3
max  12  13  14  15
In [76]: test.apply(f,axis=1)
Out[76]:
   min  max
k    0    3
b    4    7
g    8   11
h   12   15
In [79]: def f(x):
    ...:     return '%2d.0' % x
In [80]: test.applymap(f)
Out[80]:
      a     b     c     d
k   0.0   1.0   2.0   3.0
b   4.0   5.0   6.0   7.0
g   8.0   9.0  10.0  11.0
h  12.0  13.0  14.0  15.0
# series与之相对应的是map. DataFrame['a'].map(f)

sort_values sort_index numpy.argsort

sort_values主要针对行或者列数据操作排序,或者说是直接对series对象操作,如果针对DataFrame操作必须通过by指定行或列的名字。sort_index返回的是经过排序一个新对象。

In [99]: test.sort_values(by=['a','d'])
Out[99]:
    a   b   c   d
k   0   1   2   3
b   4   5   6   7
g   8   9  10  11
h  12  13  14  15
In [100]: test['a'].sort_values()
Out[100]:
k     0
b     4
g     8
h    12
Name: a, dtype: int64
In [101]: test.sort_index()
Out[101]:
    a   b   c   d
b   4   5   6   7
g   8   9  10  11
h  12  13  14  15
k   0   1   2   3

numpy.argsort返回numpy array数组从小到大排序的索引array。

test = np.array([1,4,2,-2])
In [107]: test
Out[107]: array([ 1,  4,  2, -2])
#test 从小到大对应的数组是【-2,1,2,4】,-2在test中的index是3,1在test中的index是1,4在test中的index是1.
In [108]: test.argsort()
Out[108]: array([3, 0, 2, 1])

Pandas 基本统计和数据处理

sum、mean、idxmax,idxmin,max、min、var、std和count等。这些函数自己操作去看看,如果需要特殊的操作可以google一下。

In [11]: test = DataFrame([[10.2,np.nan],[8.2,-10.1],[np.nan,np.nan],[10,2]],index=list('abcd'),columns=['br','kw'])

In [12]: test
Out[12]:
     br    kw
a  10.2   NaN
b   8.2 -10.1
c   NaN   NaN
d  10.0   2.0
In [13]: test.sum()
Out[13]:
br    28.4
kw    -8.1
dtype: float64
In [14]: test.sum(axis=1)
Out[14]:
a    10.2
b    -1.9
c     NaN
d    12.0
dtype: float64

总结

pandas具备很多操作和函数,有需要的可以到它官方文档自己去实现。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java进阶之路

Java8 Optional 的正确使用方式

1940
来自专栏一“技”之长

JavaScript基础之八——全局函数的应用

    JavaScript中提供了一些常用的全局函数,开发者可以直接对其进行调用,示例如下:

983
来自专栏blackheart的专栏

[C#3] 1-扩展方法

1.从DEMO开始 先看一个扩展方法的例子: 1 class Program 2 { 3 public static void Main(...

21910
来自专栏GreenLeaves

Jquery遍历数组之$.inArray()方法介绍

$.inArray()函数用于在数组中搜索指定的值,并返回其索引值。如果数组中不存在该值,则返回-1; $.inArray(value,array)    --...

2328
来自专栏Brian

Pandas进阶之数据规整化

---- 概述 在Pandas基本使用简单了介绍了一下Pandas的基本使用和用法,大家如果没有一点基础的同学可以先看一下那篇文章。今天我们来讲解一下Panda...

2933
来自专栏GIS讲堂

面向对象的三个基本特征

封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

1933
来自专栏恰童鞋骚年

剑指Offer面试题:14.链表的倒数第k个节点

PS:这是一道出境率极高的题目,记得去年参加校园招聘时我看到了3次,但是每次写的都不完善。

1114
来自专栏静晴轩

类数组借用数组方法

于JavaScript如何将对象转化为数组对象,其用法写法已经很常见且完善,比如JQuery中的makeArray函数对此的实现,也是跟大家想的差不多,只是考虑...

3609
来自专栏数说戏聊

00.数据结构关于浮点数运算的越界问题1.数据结构2.Pandas的两种常用数据结构3.Series系列4.DataFrame数据框

类似一维数组(ndarray)的对象,由一组数据(各种NumPy数据类型)以及与之相关的数据标签(索引)组成,用于存储一行或一列数据。

1031
来自专栏JackeyGao的博客

Leetcode 算法 -4. Median of Two Sorted Arrays

解题思路: 先把列表碾平 , 由于两个列表元素类型相同直接相加即可. 然后排序. 计算中间位置, 可以通过判断奇偶数来分别处理开始index和结束index....

773

扫码关注云+社区

领取腾讯云代金券