博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pandas-利用python进行数据分析
阅读量:6757 次
发布时间:2019-06-26

本文共 9710 字,大约阅读时间需要 32 分钟。

hot3.png

pandas简介

pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具,pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

数据结构

  • Series:一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近,其区别是:List中的元素可以是不同的数据类型,而Array和Series中则只允许存储相同的数据类型,这样可以更有效的使用内存,提高运算效率。
  • DataFrame:二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。以下的内容主要以DataFrame为主。

重新索引

pandas一个重要的方法是重新索引,创建一个新索引的新对象。(方法我只应用一遍,其他自己多加思考:如series.reindex(range(8),method='ffill') 还可以series.reindex(range(8),method='bfill'))

series=pd.Series([1,2,3,4,5,6,7],index=['less0','less1','less2','less3','less4','less5','less6'])less0    1less1    2less2    3less3    4less4    5less5    6less6    7dtype: int64series.reindex(['less1','less0','less2','less3','less4','less5','less6','b'])less1    2.0less0    1.0less2    3.0less3    4.0less4    5.0less5    6.0less6    7.0b        NaNdtype: float64series.reindex(['12','211'])12    NaN211   NaNdtype: float64series.reindex(['12','211'],fill_value=0)12     0211    0dtype: int64series=pd.Series([1,2,3,4,5,6])series.reindex(range(8),method='ffill')0    11    22    33    44    55    66    67    6dtype: int64dataframe=pd.DataFrame(np.arange(16).reshape((4,4)),index=[1,2,3,4],columns=['a','b','c','d'])dataframeIn [3]: dataframe=pd.DataFrame(np.arange(16).reshape((4,4)),index=[1,2,3,4],columns=['a','b','c','d'])   ...: dataframe   ...: Out[3]:     a   b   c   d1   0   1   2   32   4   5   6   73   8   9  10  114  12  13  14  15In [4]: dataframe.reindex(index=[2,1,3,4],columns=['c','b','a','d'])Out[4]:     c   b   a   d2   6   5   4   71   2   1   0   33  10   9   8  114  14  13  12  15In [5]: dataframe.reindex(index=[2,1,3,4],columns=['c','b','a','d','e'])Out[5]:       c     b     a     d   e2   6.0   5.0   4.0   7.0 NaN1   2.0   1.0   0.0   3.0 NaN3  10.0   9.0   8.0  11.0 NaN4  14.0  13.0  12.0  15.0 NaNIn [6]: dataframe.reindex(index=[2,1,3,4],columns=['c','b','a','d','e'],method='ffill')Out[6]:     c   b   a   d   e2   6   5   4   7   71   2   1   0   3   33  10   9   8  11  114  14  13  12  15  15In [7]: dataframe.reindex(index=[2,1,3,4],columns=['c','b','a','d','e'],method='bfill')Out[7]:     c   b   a   d   e2   6   5   4   7 NaN1   2   1   0   3 NaN3  10   9   8  11 NaN4  14  13  12  15 NaNIn [8]: dataframe.reindex(index=[2,1,3,4],columns=['c','b','a','d','e'],method='bfill',fill_value=0)Out[8]:     c   b   a   d  e2   6   5   4   7  01   2   1   0   3  03  10   9   8  11  04  14  13  12  15  0#copy 默认是true 怎样都复制,false的时候新旧相等不复制In [9]: dataframe.reindex(index=[2,1,3,4],columns=['c','b','a','d','e'],method='bfill',fill_value=0,copy=True)Out[9]:     c   b   a   d  e2   6   5   4   7  01   2   1   0   3  03  10   9   8  11  04  14  13  12  15  0

丢弃指定轴上的数据

series=pd.Series([1,2,3,4,5,6,7],index=['less0','less1','less2','less3','less4','less5','less6'])series.drop(['less1','less0','less2'])less3    4less4    5less5    6less6    7dtype: int64In [10]: dataframe=pd.DataFrame(np.arange(16).reshape((4,4)),index=[1,2,3,4],columns=['a','b','c','d'])    ...: dataframe.drop([1,2])    ...: Out[10]:     a   b   c   d3   8   9  10  114  12  13  14  15In [11]: dataframe=pd.DataFrame(np.arange(16).reshape((4,4)),index=[1,2,3,4],columns=['a','b','c','d'])    ...: dataframe.drop(columns=['a','b'],index=[1,2])    ...: Out[11]:     c   d3  10  114  14  15

索引选取过滤

series=pd.Series([1,2,3,4,5,6])series0    11    22    33    44    55    6dtype: int64In [12]: series=pd.Series([1,2,3,4,5,6])    ...: series[series>2]    ...: Out[12]: 2    33    44    55    6dtype: int64In [13]:     series=pd.Series([1,2,3,4,5,6])     ...:    series[2]    ...: Out[13]: 3series=pd.Series([1,2,3,4,5,6])series[2:5]2    33    44    5dtype: int64series=pd.Series([1,2,3,4,5,6])series[2:5]=7series0    11    22    73    74    75    6dtype: int64In [14]: dataframe=pd.DataFrame(np.arange(16).reshape((4,4)),index=[1,2,3,4],columns=['a','b','c','d'])    ...: dataframe    ...: Out[14]:     a   b   c   d1   0   1   2   32   4   5   6   73   8   9  10  114  12  13  14  15In [16]: dataframe.loc[[1,2,3],['a','c']]Out[16]:    a   c1  0   22  4   63  8  10In [17]: dataframe=pd.DataFrame(np.arange(16).reshape((4,4)),index=[1,2,3,4],columns=['a','b','c','d'])    ...: dataframe[dataframe['a']>3]    ...: Out[17]:     a   b   c   d2   4   5   6   73   8   9  10  114  12  13  14  15In [18]: dataframe=pd.DataFrame(np.arange(16).reshape((4,4)),index=[1,2,3,4],columns=['a','b','c','d'])    ...: dataframe[dataframe.loc[[1,2,3],['a','c']]>3]    ...: Out[18]:      a   b     c   d1  NaN NaN   NaN NaN2  4.0 NaN   6.0 NaN3  8.0 NaN  10.0 NaN4  NaN NaN   NaN NaNIn [20]: dataframe=pd.DataFrame(np.arange(16).reshape((4,4)),index=[1,2,3,4],columns=['a','b','c','d'])    ...: dataframe[dataframe<3]=0    ...: dataframe    ...: Out[20]:     a   b   c   d1   0   0   0   32   4   5   6   73   8   9  10  114  12  13  14  15

函数的应用和映射

In [20]: dataframe=pd.DataFrame(np.arange(16).reshape((4,4)),index=[1,2,3,4],columns=['a','b','c','d'])    ...: dataframe[dataframe<3]=0    ...: dataframe    ...: Out[20]:     a   b   c   d1   0   0   0   32   4   5   6   73   8   9  10  114  12  13  14  15In [21]: In [21]: In [21]: dataframe=pd.DataFrame(np.arange(16).reshape((4,4)),index=[1,2,3,4],columns=['a','b','c','d'])    ...: f=lambda x :x.max()-x.min()    ...: dataframe.apply(f,axis=1)    ...: Out[21]: 1    32    33    34    3dtype: int64In [22]: dataframe=pd.DataFrame(np.arange(16).reshape((4,4)),index=[1,2,3,4],columns=['a','b','c','d'])    ...: f=lambda x :x.max()-x.min()    ...: dataframe.apply(f,axis=0)    ...: Out[22]: a    12b    12c    12d    12dtype: int64#应用在元素及的函数dataframe.applymap(f2)In [24]: f2=lambda x:x/2In [25]: dataframe.applymap(f2)Out[25]:      a    b    c    d1  0.0  0.5  1.0  1.52  2.0  2.5  3.0  3.53  4.0  4.5  5.0  5.54  6.0  6.5  7.0  7.5 #一维数组直接用apply()series=pd.Series([1,2,3,4,5,6])series.apply(f2)0    0.51    1.02    1.53    2.04    2.55    3.0dtype: float64

常用函数

df 代表的是任意的Pandas DataFrame对象 s 代表的是任意的Pandas Series对象

  • 导入数据

    pd.read_csv(filename):从CSV文件导入数据

    pd.read_table(filename):从限定分隔符的文本文件导入数据

    pd.read_excel(filename):从Excel文件导入数据

    pd.read_sql(query,connection_object):从SQL表/库导入数据

    pd.read_json(json_string):从JSON格式的字符串导入数据

    pd.read_html(url):解析URL、字符串或者HTML文件,抽取其中的tables表格

    pd.read_clipboard():从你的粘贴板获取内容,并传给read_table()

    pd.DataFrame(dict):从字典对象导入数据,Key是列名,Value是数据

  • 导出数据 df.to_csv(filename):导出数据到CSV文件

    df.to_excel(filename):导出数据到Excel文件

    df.to_sql(table_name,connection_object):导出数据到SQL表

    df.to_json(filename):以Json格式导出数据到文本文件

  • 查看、检查数据 df.head(n):查看DataFrame对象的前n行

    df.tail(n):查看DataFrame对象的最后n行

    df.shape():查看行数和列数

    df.describe():查看数值型列的汇总统计

    s.value_counts(dropna=False):查看Series对象的唯一值和计数

  • 数据选取 df[col]:根据列名,并以Series的形式返回列

    df[[col1,col2]]:以DataFrame形式返回多列

    s.iloc[0]:按位置选取数据

    s.loc['index_one']:按索引选取数据

    df.iloc[0,:]:返回第一行

    df.iloc[0,0]:返回第一列的第一个元素

  • 数据清理

    df.columns=['a','b','c']:重命名列名

    pd.isnull():检查DataFrame对象中的空值,并返回一个Boolean数组

    pd.notnull():检查DataFrame对象中的非空值,并返回一个Boolean数组

    df.dropna():删除所有包含空值的行

    df.dropna(axis=1):删除所有包含空值的列

    df.dropna(axis=1,thresh=n):删除所有小于n个非空值的行

    df.fillna(x):用x替换DataFrame对象中所有的空值

    s.astype(float):将Series中的数据类型更改为float类型

    s.replace(1,'one'):用‘one’代替所有等于1的值

    s.replace([1,3],['one','three']):用'one'代替1,用'three'代替3

    df.rename(columns=lambdax:x+1):批量更改列名

    df.rename(columns={'old_name':'new_ name'}):选择性更改列名

    df.set_index('column_one'):更改索引列

    df.rename(index=lambdax:x+1):批量重命名索引

In [27]: dataframe=pd.DataFrame(np.arange(16).reshape((4,4)),index=[1,2,3,4],columns=[1,2,3,4])    ...: dataframe    ...: dataframe.set_index(4)    ...: Out[27]:      1   2   343    0   1   27    4   5   611   8   9  1015  12  13  14
  • 数据处理:Filter、Sort和GroupBy

    df[df[col]>0.5]:选择col列的值大于0.5的行

    df.sort_values(col1):按照列col1排序数据,默认升序排列

    df.sort_values(col2,ascending=False):按照列col1降序排列数据

    df.sort_values([col1,col2],ascending=[True,False]):先按列col1升序排列,后按col2降序排列数据 df.groupby(col):返回一个按列col进行分组的Groupby对象

    df.groupby([col1,col2]):返回一个按多列进行分组的Groupby对象

    df.groupby(col1)[col2]:返回按列col1进行分组后,列col2的均值 df.pivot_table(index=col1,

    values=[col2,col3],aggfunc=max):创建一个按列col1进行分组,并计算col2和col3的最大值的数据透视表

    df.groupby(col1).agg(np.mean):返回按列col1分组的所有列的均值

    data.apply(np.mean):对DataFrame中的每一列应用函数np.mean

    data.apply(np.max,axis=1):对DataFrame中的每一行应用函数np.max

  • 数据合并

    df1.append(df2):将df2中的行添加到df1的尾部

    pd.concat([df1,df2],axis=1):将df2中的列添加到df1的尾部

    df1.join(df2,on=col1,how='inner'):对df1的列和df2的列执行SQL形式的join

  • 数据统计

    df.describe():查看数据值列的汇总统计

    df.mean():返回所有列的均值

    df.corr():返回列与列之间的相关系数

    df.count():返回每一列中的非空值的个数

    df.max():返回每一列的最大值

    df.min():返回每一列的最小值

    df.median():返回每一列的中位数

    df.std():返回每一列的标准差

层次化索引

pd.Series([1,2,34,5,67,8,90,23,4,5],index=[['one','one','one','two','one','one','three','three','three','three'],[1,2,3,4,5,6,7,8,9,10]])one    1      1       2      2       3     34two    4      5one    5     67       6      8three  7     90       8     23       9      4       10     5dtype: int64series['one']1     12     23    345    676     8dtype: int64series['one',3]#重排分级顺序series=pd.Series([1,2,34,5,67,8,90,23,4,5],index=[['one','one','one','two','one','one','three','three','three','three'],[1,2,3,4,5,6,7,8,9,10]])#同理列也可以指定名称series.index.names=['key1','key2']key1   key2one    1        1       2        2       3       34two    4        5one    5       67       6        8three  7       90       8       23       9        4       10       5dtype: int64series.swaplevel('key2','key1')key2  key1 1     one       12     one       23     one      344     two       55     one      676     one       87     three    908     three    239     three     410    three     5dtype: int64#更具级别获取统计数据series.sum(level='key1')key1one      112two        5three    122dtype: int64series.sum(level='key2')key21      12      23     344      55     676      87     908     239      410     5dtype: int64

转载于:https://my.oschina.net/jiansin/blog/1798346

你可能感兴趣的文章
android handler概念解释
查看>>
eclipse代码左虚线对齐设置
查看>>
插入排序的Java代码实现
查看>>
Spring整合Web开发
查看>>
在SContruct中编译.c
查看>>
让ubuntu开启ssh服务以及让vi/vim正常使用方向键与退格键
查看>>
10.两个链表的交叉
查看>>
Visio Premium 2010密钥+破解激活方法
查看>>
JEE , EJB概念深入概括
查看>>
socket通信简单介绍
查看>>
Unity3D逻辑热更新,第二代舒爽解决方案,L#使用简介
查看>>
状态码表
查看>>
产品经理:想爱没那么简单
查看>>
Java:按值传递还是按引用传递详细解说
查看>>
(转)HTML字符实体(Character Entities),转义字符串(Escape Sequence)
查看>>
去掉 Android工程中让人很不爽的“黄色警告”
查看>>
aliyun阿里云Maven仓库地址
查看>>
jdk1.8 HashMap源码分析(resize函数)
查看>>
再看static数据成员
查看>>
Pthon Matplotlib 画图
查看>>