官方练习 Pandas 数据结构简介 Series VS DataFrame

传递的索引是轴标签列表。因此,根据数据的不同,这可分为几种情况:

In [42]:

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

来自ndarray

如果data是ndarray,则索引的长度必须与数据的长度相同。如果没有传递索引,将创建一个具有值的索引。[0, ..., len(data) - 1]

s = pd.Series(data, index=index) 在这里,data可以有很多不同的东西:

一个Python字典

一个ndarray

标量值(如5)

传递的索引是轴标签列表。

In [43]:

s = pd.Series(np.random.randn(5),index=['a', 'b', 'c', 'd', 'e'])
s

Out[43]:

a    0.752638
b    0.677576
c    0.070753
d   -1.030516
e    0.030880
dtype: float64

In [44]:

s.index

Out[44]:

Index(['a', 'b', 'c', 'd', 'e'], dtype='object')

In [45]:

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

Out[45]:

0   -0.342847
1    0.595423
2   -0.287877
3   -0.742966
4   -0.738780
dtype: float64

从dict

注意 当数据是dict,并且未传递Series索引时,如果您使用的是Python版本> = 3.6且Pandas版本> = 0.23 ,则索引将按dict的插入顺序排序。

如果您使用的是Python <3.6或Pandas <0.23,并且未传递Series索引,则索引将是词汇顺序的dict键列表。

In [89]:

d = {'b' : 1, 'a' : 0, 'c' : 2}
pd.Series(d).index

Out[89]:

Index(['a', 'b', 'c'], dtype='object')

In [87]:

d = {'a' : 0., 'b' : 1., 'c' : 2.}
pd.Series(d)

Out[87]:

a    0.0
b    1.0
c    2.0
dtype: float64

如果传递索引,则将拉出与索引中的标签对应的数据中的值。 空余的为NaN

In [48]:

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

Out[48]:

b    1.0
c    2.0
d    NaN
a    0.0
dtype: float64

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

In [49]:

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

Out[49]:

a    5
b    5
c    5
d    5
e    5
dtype: int64

In [50]:

pd.Series([5.,3.,5.,3.,2], index=['a', 'b', 'c', 'd', 'e'])

Out[50]:

a    5.0
b    3.0
c    5.0
d    3.0
e    2.0
dtype: float64

Series行为与a非常相似ndarray,并且是大多数NumPy函数的有效参数。但是,切片等操作也会对索引进行切片。

In [51]:

s

Out[51]:

a    0.752638
b    0.677576
c    0.070753
d   -1.030516
e    0.030880
dtype: float64

In [52]:

s[0]

Out[52]:

0.75263790197081093

In [53]:

s[:3]

Out[53]:

a    0.752638
b    0.677576
c    0.070753
dtype: float64

In [54]:

s[s>s.median()]

Out[54]:

a    0.752638
b    0.677576
dtype: float64

In [55]:

s[[4, 3, 1]]

Out[55]:

e    0.030880
d   -1.030516
b    0.677576
dtype: float64

In [56]:

np.exp(s)

Out[56]:

a    2.122592
b    1.969099
c    1.073316
d    0.356823
e    1.031362
dtype: float64

Series类似于固定大小的dict,您可以通过索引标签获取和设置值

In [57]:

s['a']

Out[57]:

0.75263790197081093

In [58]:

s['e']

Out[58]:

0.030879785155672308

In [59]:

s

Out[59]:

a    0.752638
b    0.677576
c    0.070753
d   -1.030516
e    0.030880
dtype: float64

In [61]:

'e' in s

Out[61]:

True

In [62]:

'f' in s

Out[62]:

False

In [64]:

# 如果未包含标签,则会引发异常:
#s['f']

使用该get方法,缺少的标签将返回None或指定的默认值:

In [65]:

s.get('f')

In [66]:

s.get('f', np.nan)

Out[66]:

nan

使用Series¶进行矢量化操作和标签对齐

使用原始NumPy数组时,通常不需要循环使用value-by-value。

在pandas中使用Series时也是如此。系列也可以传递到大多数期待ndarray的NumPy方法。

In [72]:

s

Out[72]:

a    0.752638
b    0.677576
c    0.070753
d   -1.030516
e    0.030880
dtype: float64

In [69]:

s+s

Out[69]:

a    1.505276
b    1.355152
c    0.141507
d   -2.061032
e    0.061760
dtype: float64

In [70]:

s*2

Out[70]:

a    1.505276
b    1.355152
c    0.141507
d   -2.061032
e    0.061760
dtype: float64

In [71]:

np.exp(s)

Out[71]:

a    2.122592
b    1.969099
c    1.073316
d    0.356823
e    1.031362
dtype: float64

Series和ndarray之间的主要区别在于Series之间的操作会根据标签自动对齐数据。

因此,您可以在不考虑所涉及的系列是否具有相同标签的情况下编写计算。

In [77]:

s[1:]

Out[77]:

b    0.677576
c    0.070753
d   -1.030516
e    0.030880
dtype: float64

In [78]:

s[:-1]

Out[78]:

a    0.752638
b    0.677576
c    0.070753
d   -1.030516
dtype: float64

未对齐Series之间的操作结果将包含所涉及的索引的并集。

如果在一个系列或另一个系列中找不到标签,则结果将标记为缺失NaN。

In [79]:

s[1:]+s[:-1]

Out[79]:

a         NaN
b    1.355152
c    0.141507
d   -2.061032
e         NaN
dtype: float64

Series也可以有一个name属性:

name在许多情况下,Series将自动分配,特别是在拍摄一维DataFrame时,如下所示。

In [84]:

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

Out[84]:

0    0.070190
1    2.264641
2    0.416647
3   -1.156442
4   -0.259729
Name: something, dtype: float64

In [85]:

s.name

Out[85]:

'something'

版本0.18.0中的新功能。

您可以使用该pandas.Series.rename()方法重命名Series 。

In [86]:

s2 = s.rename("different")
s2

Out[86]:

0    0.070190
1    2.264641
2    0.416647
3   -1.156442
4   -0.259729
Name: different, dtype: float64

DataFrame是一个二维标记数据结构,具有可能不同类型的列。

您可以将其视为电子表格或SQL表,或Series对象的字典。

它通常是最常用的pandas对象。与Series类似,DataFrame接受许多不同类型的输入:

1D ndarray,list,dicts或Series的Dict

二维numpy.ndarray

结构化或记录 ndarray

一个 Series

另一个 DataFrame

除了数据,您还可以选择传递索引(行标签)和 列(列标签)参数。

1、从Series或词典的词典

得到的指数将是工会的各种系列的指标。 如果有任何嵌套的dicts,这些将首先转换为Series。

如果没有传递列,则列将是dict键的有序列表。

In [96]:

d = {'one' : pd.Series([1., 2., 3.], index=['a', 'b', 'c'])}
df = pd.DataFrame(d)
df

Out[96]:

  one
a 1.0
b 2.0
c 3.0

In [97]:

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

In [98]:

df = pd.DataFrame(d)
df

Out[98]:

  one two
a 1.0 1.0
b 2.0 2.0
c 3.0 3.0
d NaN 4.0

In [99]:

pd.DataFrame(d, index=['d', 'b', 'a'])

Out[99]:

  one two
d NaN 4.0
b 2.0 2.0
a 1.0 1.0

In [100]:

pd.DataFrame(d, index=['d', 'b', 'a'],columns=['two','three'])

Out[100]:

  two three
d 4.0 NaN
b 2.0 NaN
a 1.0 NaN

通过访问索引和列属性,可以分别访问行和列标签 :

注意 当一组特定的列与数据的dict一起传递时,传递的列将覆盖dict中的键。

In [102]:

df.index

Out[102]:

Index(['a', 'b', 'c', 'd'], dtype='object')

In [103]:

df.columns

Out[103]:

Index(['one', 'two'], dtype='object')

从ndarrays / lists的字典

ndarrays必须都是相同的长度。如果传递索引,则它必须明显与数组的长度相同。

如果没有传递索引,结果将是range(n),n数组长度在哪里。

In [105]:

d = {'one' : [1., 2., 3., 4.],
      'two' : [4., 3., 2., 1.]}

In [106]:

pd.DataFrame(d)

Out[106]:

  one two
0 1.0 4.0
1 2.0 3.0
2 3.0 2.0
3 4.0 1.0

In [107]:

pd.DataFrame(d,index=['a', 'b', 'c', 'd'])

Out[107]:

  one two
a 1.0 4.0
b 2.0 3.0
c 3.0 2.0
d 4.0 1.0

从结构化或记录数组

这种情况的处理方式与数组的字典相同。

In [117]:

data = np.zeros((2,))
data

Out[117]:

array([ 0.,  0.])

In [118]:

data = np.zeros((2,),dtype=[('A','i4'),('B', 'f4'),('C', 'a10')])
data

Out[118]:

array([(0,  0., b''), (0,  0., b'')],
      dtype=[('A', '<i4'), ('B', '<f4'), ('C', 'S10')])

In [124]:

data = [(1,2,'Hello'),(2,3,'World')]
data

Out[124]:

[(1, 2, 'Hello'), (2, 3, 'World')]

In [120]:

pd.DataFrame(data)

Out[120]:

  0 1 2
0 1 2 Hello
1 2 3 World

In [126]:

pd.DataFrame(data,index=['first','second'],columns=['C', 'A', 'B'])

Out[126]:

  C A B
first 1 2 Hello
second 2 3 World

In [125]:

pd.DataFrame(data, columns=['C', 'A', 'B'])

Out[125]:

  C A B
0 1 2 Hello
1 2 3 World

从dicts列表

In [129]:

data2 = [{'a': 1, 'b': 2}]
pd.Series(data2)

Out[129]:

0    {'a': 1, 'b': 2}
dtype: object

In [130]:

data2 = [{'a': 1, 'b': 2}]
pd.DataFrame(data2)

Out[130]:

  a b
0 1 2

In [131]:

data2 = [{'a': 1, 'b': 2}, 
         {'a': 5, 'b': 10, 'c': 20}]
pd.DataFrame(data2)

Out[131]:

  a b c
0 1 2 NaN
1 5 10 20.0

行标签必须与行数相等,列标签可以不等,也可以不存在,不存在了所在列全部补充NaN

In [134]:

pd.DataFrame(data2, index=['first', 'second'])

Out[134]:

  a b c
first 1 2 NaN
second 5 10 20.0

In [137]:

pd.DataFrame(data2, columns=['a', 'e'])

Out[137]:

  a e
0 1 NaN
1 5 NaN

从元组的词典,您可以通过传递元组字典自动创建多索引框架

In [139]:

pd.DataFrame({('a', 'b'): {('A', 'B'): 1, ('A', 'C'): 2}})

Out[139]:

    a
    b
A B 1
C 2

In [138]:

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[138]:

    a b
    a b c a b
A B 4.0 1.0 5.0 8.0 10.0
C 3.0 2.0 6.0 7.0 NaN
D NaN NaN NaN NaN 9.0

从Series

结果将是一个与输入Series具有相同索引的DataFrame,以及一个列,

其名称是Series的原始名称(仅当没有提供其他列名时)。

日期时间

对于datetime64 [ns]类型,NaT表示缺少的值。这是一个伪本机标记值,可以由单个dtype(datetime64 [ns])中的NumPy表示。

pandas对象提供NaT和之间的互操作性NaN。

猜你喜欢

转载自blog.csdn.net/zhibudefeng/article/details/83243670