Pandas的数据类型

Pandas是Python的一个非常常见的第三方库文件,是一个Powerful python data analysis,由Wes Mckinney & PyData Development Team开发的的免费库文件,是python做数据分析、机器学习的神兵利器。下面参考Pandas的帮助文档,介绍Pandas的基本数据类型,供自己自学和大家参考。


Series

Series的创建

Series是一维的带标签的数列,并且其中的元素可是同时是任何类型,如整数、字符串和浮点数等Python支持的数据类型。与python中的List比较相似,但与之不同的是,Series的每个元素还有一个唯一的标签(Label)。Series的基本创建方法如下所示,先要导入Pandas库文件,再调用构造函数进行创建。

import pandas as pd
s = pd.Series(data, index)

其中data可以是标量、Python的dict或numpy中的多维数组(ndarray),index是每个元素对应的标签列表。

由标量创建

s1 = pd.Series(1.0)

s1的具体内容
其index默认为零,Python的下标均是由零开始编号的。

s2 = pd.Series(1.0, index = ['a', 'b', 'c'])

s2的具体内容
对于指定了index列表的Series,标量将相应地重复若干次。

由字典创建

d1 = {'a': 1.0, 'b': 2.0, 'c': 3.0}
s3 = pd.Series(d1)

s3的具体内容
由dict创建的Series,其index为dict的key。
若在由dict创建Series时,指定了index列表的情况,其结果需要注意。

d2 = {'a': 1.0, 'b': 2.0, 'c': 3.0, 'd': 4.0}
s4 = pd.Series(d2, index = ['e', 'f', 'g', 'h'])

如上两条代码,由d2创建Series,同时给定了index列表。s4的结果为index为指定的列表,但值均为空。原因是该代码的意思是从d2中取index为[‘e’, ‘f’, ‘g’, ‘h’]的数,然后组成Series。
s4的具体内容

由多维数组创建

多维数值(ndarray)是numpy中最为基本的数据类型,相当与数学上的张量(Tensor)。

a1 = np.random.randn(5)
s5 = pd.Series(a1)

这里写图片描述
不给定index列表,则默认index为[0, 1, …, len(a1) - 1].

s6 = pd.Series(a1, index = ['a', 'b', 'c', 'd', 'e'])

s6的具体内容
同样可以给定其index列表,结果与由dict创建的方式是不同的。

Series的特征

Python语言有个很大的特征就是Object-like,个人理解有重载的意味。虽然某些对象不属于某些类,但这些对象仍然具有该类的一些特征,可以调用该类的一些方法。

类ndarray的特征

Series对象可以正确调用numpy的方法,如切片、数学计算函数等,具有与ndarray相似的特征。

a2 = np.array([1, 2, 3, 4, 5])
s7 = pd.Series(a2, index = ['a', 'b', 'c', 'd', 'e'])
In [20]: s7[0]
Out[20]: 1
In [21]: s7[:3]
Out[21]: 
a    1
b    2
c    3
dtype: int32

In [22]: s7[['c', 'a', 'b']]
Out[22]: 
c    3
a    1
b    2
dtype: int32
In [23]: np.exp(s7)
Out[23]: 
a      2.718282
b      7.389056
c     20.085537
d     54.598150
e    148.413159
dtype: float64

类dict的特征

Series可以像dict一样按照index(dict的key)对数据进行访问。

In [24]: s4 = pd.Series(d2)
In [25]: s4['a']
Out[25]: 1.0
In [26]: s4
Out[26]: 
a    1.0
b    2.0
c    3.0
d    4.0
dtype: float64
In [27]: 'b' in s4
Out[27]: True
In [28]: 'f' in s4
Out[28]: False

Series的向量功能

以向量的形式对数据进行操作无疑比按元素对数据进行操作的方式效率要高很多,Series同样也具备向numpy中的ndarray类似的向量功能,支持向向量一样的加、减和乘和三角函数等运算。向量运算是按照下标,而Series对象进行运算按照的是index。

In [29]: s7 + s7
Out[29]: 
a     2
b     4
c     6
d     8
e    10
dtype: int32

In [30]: s7 * 2
Out[30]: 
a     2
b     4
c     6
d     8
e    10
dtype: int32

In [31]: s7 ** 2
Out[31]: 
a     1
b     4
c     9
d    16
e    25
dtype: int32

In [32]: np.sin(s7)
Out[32]: 
a    0.841471
b    0.909297
c    0.141120
d   -0.756802
e   -0.958924
dtype: float64

DataFrame

DataFrame是二维的带标签的数据结构,支持不同的列的元素是不同的数据类型,就像是一张表格一样,是pandas中最为常见的一种数据格式。

DataFrame的创建

与Series一样DataFrame同样支持由不同的数据类型进行创建,可以由Series构成的dict、由ndarray构成的dict等进行创建。但在实际数据分析中,更多地是读取excel或csv文件直接形成DateFrame。

由Series构成的dict创建

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

In [43]: df = pd.DataFrame(d)

In [44]: df
Out[44]: 
   one  two
a  1.0  1.0
b  2.0  2.0
c  3.0  3.0
d  NaN  4.0

Series相当于DataFrame的一个列,其列的标签(columns)为dict中的key,而Series中的标签(index)则成为DataFrame中行的标签(index),对于没有该标签对应的数值,以NaN代替。
同样可以按行或列抽取DataFrame形成新的DataFrame。

In [45]: pd.DataFrame(d, index = ['d', 'b', 'a'])
Out[45]: 
   one  two
d  NaN  4.0
b  2.0  2.0
a  1.0  1.0

In [46]: pd.DataFrame(d, index = ['b', 'a', 'c'], columns= ['two', 'one'])
Out[46]: 
   two  one
b  2.0  2.0
a  1.0  1.0
c  3.0  3.0

DataFrame对象行的标签称为index,列的标签称为columns,这个叫法与Series的标签为index的叫法是兼容的。

In [47]: df.index
Out[47]: Index(['a', 'b', 'c', 'd'], dtype='object')

In [48]: df.columns
Out[48]: Index(['one', 'two'], dtype='object')

由ndarray、list构成的dict创建

与2.1.1由Series构成的dict创建的逻辑完全一致,可以由ndarray、list构成的dict创建DataFrame,但ndarray和list没有index,可以在创建DataFrame的时候给定其index,若不给定index将为[0, 1, …, len(a1) - 1]。

In [49]: d2 = {'one': np.array([1., 2., 3., 4.]), 'two': np.array([4., 3., 2., 1.])}

In [50]: df2 = pd.DataFrame(d2)

In [51]: df2
Out[51]: 
   one  two
0  1.0  4.0
1  2.0  3.0
2  3.0  2.0
3  4.0  1.0

In [52]: pd.DataFrame(d2, index = ['a', 'b', 'c', 'd'])
Out[52]: 
   one  two
a  1.0  4.0
b  2.0  3.0
c  3.0  2.0
d  4.0  1.0

由字典组成的列表创建

In [56]: l1 = [{'a': 1., 'b': 2., 'c': 3.}, {'a': 6., 'b': 7.}]

In [57]: pd.DataFrame(l1)
Out[57]: 
     a    b    c
0  1.0  2.0  3.0
1  6.0  7.0  NaN

In [58]: pd.DataFrame(l1, index = ['one', 'two'])
Out[58]: 
       a    b    c
one  1.0  2.0  3.0
two  6.0  7.0  NaN

dict中的key是作为列标(columns),而index可以另外给定。

列运算

DataFrame的每一列就是一个Series对象,可以进行运算,并添加新的列。

In [59]: df
Out[59]: 
   one  two
a  1.0  1.0
b  2.0  2.0
c  3.0  3.0
d  NaN  4.0

In [60]: df['three'] = df['one'] * df['two']

In [61]: df['flag']= df['two'] > 2

In [62]: df
Out[62]: 
   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   True

DataFrame对象的列可以像dict一样,对列进行删除或者弹出。

In [64]: del df['flag']

In [65]: df
Out[65]: 
   one  two  three
a  1.0  1.0    1.0
b  2.0  2.0    4.0
c  3.0  3.0    9.0
d  NaN  4.0    NaN

In [66]: df.pop('three')
Out[66]: 
a    1.0
b    4.0
c    9.0
d    NaN
Name: three, dtype: float64

In [67]: df
Out[67]: 
   one  two
a  1.0  1.0
b  2.0  2.0
c  3.0  3.0
d  NaN  4.0

DataFrame对象还有一个assign方法,可以由原DataFrame对象创建一个新的原DataFrame对象,结合Python匿名函数lambda威力巨大。

DataFrame的抽取

DataFrame对象可以按colums或则index进行抽取,df.iloc[1],df[1:2]结果看起来似乎一样,但实际上前者返回的是Series对象,而后者返回的是DataFrame对象。

In [87]: df
Out[87]: 
   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   True

In [88]: df['one']
Out[88]: 
a    1.0
b    2.0
c    3.0
d    NaN
Name: one, dtype: float64

In [89]: df.iloc[1]
Out[89]: 
one          2
two          2
three        4
flag     False
Name: b, dtype: object

In [90]: df[1:2]
Out[90]: 
   one  two  three   flag
b  2.0  2.0    4.0  False

In [91]: df.loc['b']
Out[91]: 
one          2
two          2
three        4
flag     False
Name: b, dtype: object

DataFrame对象的算术运算

两DataFrame对象之间做算术运算,按行、列分别Broadcasting(numpy中的一个重要概念)再行计算。

In [92]: df1 = pd.DataFrame(np.random.randn(10, 4), columns = ['A', 'B', 'C', 'D'])

In [93]: df2 = pd.DataFrame(np.random.randn(7, 3), columns = ['A', 'B', 'C'])

In [94]: df1 + df2
Out[94]: 
          A         B         C   D
0 -0.010779  0.691875  0.682065 NaN
1  0.229425 -1.110304 -2.157746 NaN
2  1.335773  3.017245  1.956967 NaN
3  0.042342 -1.507396 -1.247462 NaN
4 -0.742930  0.297918 -0.215166 NaN
5 -1.592344 -0.871347 -1.467166 NaN
6  0.752005  0.731373 -0.397593 NaN
7       NaN       NaN       NaN NaN
8       NaN       NaN       NaN NaN
9       NaN       NaN       NaN NaN

但DataFrame对象与Series对象做计算时,DataFrame对象的columns与Series对象的index匹配。

In [96]: df1 - df1.iloc[0]
Out[96]: 
          A         B         C         D
0  0.000000  0.000000  0.000000  0.000000
1 -0.478747 -2.017994 -0.585537  0.575913
2 -0.172299  0.875062  2.772613 -0.927169
3  0.742281 -2.845286  0.606055 -0.567066
4  1.118843 -1.142414  0.217208 -2.438106
5 -0.913234 -1.046124  0.539282  0.909775
6  0.133293 -1.789307  0.183632 -0.378401
7 -0.657302 -1.401095  2.196192  2.561012
8 -0.316676 -0.550854  0.604271 -1.054772
9  0.212068 -1.952638  0.762744 -0.350252

猜你喜欢

转载自blog.csdn.net/u012604810/article/details/75232936