pandas-利用python进行数据分析

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    1
less1    2
less2    3
less3    4
less4    5
less5    6
less6    7
dtype: int64

series.reindex(['less1','less0','less2','less3','less4','less5','less6','b'])
less1    2.0
less0    1.0
less2    3.0
less3    4.0
less4    5.0
less5    6.0
less6    7.0
b        NaN
dtype: float64

series.reindex(['12','211'])
12    NaN
211   NaN
dtype: float64

series.reindex(['12','211'],fill_value=0)
12     0
211    0
dtype: int64

series=pd.Series([1,2,3,4,5,6])
series.reindex(range(8),method='ffill')

0    1
1    2
2    3
3    4
4    5
5    6
6    6
7    6
dtype: int64

dataframe=pd.DataFrame(np.arange(16).reshape((4,4)),index=[1,2,3,4],columns=['a','b','c','d'])
dataframe

In [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   d
1   0   1   2   3
2   4   5   6   7
3   8   9  10  11
4  12  13  14  15

In [4]: dataframe.reindex(index=[2,1,3,4],columns=['c','b','a','d'])
Out[4]: 
    c   b   a   d
2   6   5   4   7
1   2   1   0   3
3  10   9   8  11
4  14  13  12  15


In [5]: dataframe.reindex(index=[2,1,3,4],columns=['c','b','a','d','e'])
Out[5]: 
      c     b     a     d   e
2   6.0   5.0   4.0   7.0 NaN
1   2.0   1.0   0.0   3.0 NaN
3  10.0   9.0   8.0  11.0 NaN
4  14.0  13.0  12.0  15.0 NaN

In [6]: dataframe.reindex(index=[2,1,3,4],columns=['c','b','a','d','e'],method='ffill')
Out[6]: 
    c   b   a   d   e
2   6   5   4   7   7
1   2   1   0   3   3
3  10   9   8  11  11
4  14  13  12  15  15

In [7]: dataframe.reindex(index=[2,1,3,4],columns=['c','b','a','d','e'],method='bfill')
Out[7]: 
    c   b   a   d   e
2   6   5   4   7 NaN
1   2   1   0   3 NaN
3  10   9   8  11 NaN
4  14  13  12  15 NaN

In [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  e
2   6   5   4   7  0
1   2   1   0   3  0
3  10   9   8  11  0
4  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  e
2   6   5   4   7  0
1   2   1   0   3  0
3  10   9   8  11  0
4  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    4
less4    5
less5    6
less6    7
dtype: int64

In [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   d
3   8   9  10  11
4  12  13  14  15

In [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   d
3  10  11
4  14  15

索引选取过滤

series=pd.Series([1,2,3,4,5,6])
series
0    1
1    2
2    3
3    4
4    5
5    6
dtype: int64

In [12]: series=pd.Series([1,2,3,4,5,6])
    ...: series[series>2]
    ...: 
Out[12]: 
2    3
3    4
4    5
5    6
dtype: int64

In [13]:     series=pd.Series([1,2,3,4,5,6])
     ...:    series[2]
    ...: 
Out[13]: 3

series=pd.Series([1,2,3,4,5,6])
series[2:5]
2    3
3    4
4    5
dtype: int64

series=pd.Series([1,2,3,4,5,6])
series[2:5]=7
series
0    1
1    2
2    7
3    7
4    7
5    6
dtype: int64

In [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   d
1   0   1   2   3
2   4   5   6   7
3   8   9  10  11
4  12  13  14  15


In [16]: dataframe.loc[[1,2,3],['a','c']]
Out[16]: 
   a   c
1  0   2
2  4   6
3  8  10


In [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   d
2   4   5   6   7
3   8   9  10  11
4  12  13  14  15

In [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   d
1  NaN NaN   NaN NaN
2  4.0 NaN   6.0 NaN
3  8.0 NaN  10.0 NaN
4  NaN NaN   NaN NaN

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   d
1   0   0   0   3
2   4   5   6   7
3   8   9  10  11
4  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   d
1   0   0   0   3
2   4   5   6   7
3   8   9  10  11
4  12  13  14  15

In [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    3
2    3
3    3
4    3
dtype: int64

In [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    12
b    12
c    12
d    12
dtype: int64

#应用在元素及的函数
dataframe.applymap(f2)
In [24]: f2=lambda x:x/2

In [25]: dataframe.applymap(f2)
Out[25]: 
     a    b    c    d
1  0.0  0.5  1.0  1.5
2  2.0  2.5  3.0  3.5
3  4.0  4.5  5.0  5.5
4  6.0  6.5  7.0  7.5
 #一维数组直接用apply()
series=pd.Series([1,2,3,4,5,6])
series.apply(f2)
0    0.5
1    1.0
2    1.5
3    2.0
4    2.5
5    3.0
dtype: 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():查看行数和列数

    http://df.info():查看索引、数据类型和内存信息

    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   3
4
3    0   1   2
7    4   5   6
11   8   9  10
15  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     34
two    4      5
one    5     67
       6      8
three  7     90
       8     23
       9      4
       10     5
dtype: int64

series['one']
1     1
2     2
3    34
5    67
6     8
dtype: int64

series['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   key2
one    1        1
       2        2
       3       34
two    4        5
one    5       67
       6        8
three  7       90
       8       23
       9        4
       10       5
dtype: int64

series.swaplevel('key2','key1')
key2  key1 
1     one       1
2     one       2
3     one      34
4     two       5
5     one      67
6     one       8
7     three    90
8     three    23
9     three     4
10    three     5
dtype: int64

#更具级别获取统计数据

series.sum(level='key1')
key1
one      112
two        5
three    122
dtype: int64

series.sum(level='key2')
key2
1      1
2      2
3     34
4      5
5     67
6      8
7     90
8     23
9      4
10     5
dtype: int64

猜你喜欢

转载自my.oschina.net/u/3798913/blog/1798346