Java_S 发表于 2020-9-24 19:48

Pandas笔记之四大重要对象

本帖最后由 Java_S 于 2020-9-24 20:08 编辑

# 写在前面 #
**本文假定你已对Numpy和Pandas有所了解**
这次向大家介绍一下Pandas中四大重要的对象
Series\DataFrame\Index\MultiIndex

欢迎大家到我的个人博客闲逛(https://syjun.vip)

我们先做一个约定,约定你代码的第一行
```python
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
```

# Series #
**Series属性及方法**


- Series一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近,其区别是:List中的元素可以是不同的数据类型,而Array和Series中则只允许存储相同的数据类型,这样可以更有效的使用内存,提高运算效率.

**一个简单的列子**
```python
ser1=Series()
ser1
```
代码结果
```python
0    4
1    12
2   -12
3   -4
dtype: int64
```

- 通常,我们自己就可以创建索引:


```python
ser2=Series(,index=['b','c','a','d'])
ser2
```
代码结果
```python
b    4
c    12
a   -12
d   -4
dtype: int64
```

## values和index ##

- Series有两个很最要的属性values和index,分别获取内容和索引

### values ###
>ser1.values

代码结果
>array([ 4,12, -12,-4], dtype=int64)


----------

### index ###
>ser1.index

代码结果
>RangeIndex(start=0, stop=4, step=1)

## 可将字典转换为Series ##
```python
dict={"red":100,"black":400,"green":300,"pink":900}
ser3 = Series(dict)
ser
```
代码结果
```python
black    400
green    300
pink   900
red      100
dtype: int64
```

## pandas的isnull和nonull可检测缺失数据 ##
### isnull ###

```python
pd.isnull(ser3)
```
代码结果
```python
purple    False
brown   False
glod      False
blue      False
Name: values, dtype: bool
### notnull ###
```

```python
pd.notnull(ser3)
```
代码结果
```python
purple    True
brown   True
glod      True
blue      True
Name: values, dtype: bool
```


# DataFrame #
DataFrame 是 Python 中 Pandas 库中的一种数据结构,是一种二维表。它类似 excel,或许说它可能有点像 matlab 的矩阵,但是 matlab 的矩阵只能放数值型值(当然 matlab 也可以用 cell 存放多类型数据),DataFrame 的单元格可以存放数值、字符串等,这就和 excel 表很像。

## 一、DataFrame对象常用属性 ##

- 创建DateFrame方法有很多(后面再介绍),最常用的是直接传入一个由等长列表或Numpy组成的字典:

```python
dict1={"Province":["Guangdong","Beijing","Qinghai","Fujiang"],
      "year":*4,
      "pop":}
df1=DataFrame(dict1)
df1
```
代码结果:

|   | Province | year| pop |
| -------- | -------- | -------- | -------- |
| 0 | Guangdong | 2018 | 1.3 |
| 1 | Beijing | 2018 | 2.5 |
| 2 | Qinghai | 2018 | 1.1 |
| 3| Fujiang| 2018| 0.7|




- 同Series一样,也可在创建时指定序列(对于字典中缺失的用NaN):


```python
df2=DataFrame(dict1,
            columns=['year','Province','pop','debt'],
            index=['one','two','three','four'])
df2
```
代码结果:

|| Province | year| pop | debt |
| ---- | ---- | ---- | ---- | ---- |
| one | Guangdong | 2018 | 1.3 | NaN |
| two | Beijing | 2018 | 2.5 | NaN |
| three | Qinghai | 2018 | 1.1 | NaN |
| four | Fujiang | 2018 | 0.7 | NaN |

- 同Series一样,DataFrame的index和columns有name属性:


```python
df2.index.name='English'
df2.columns.name='Province'
df2
```
代码结果

| Province | Province | year| pop | debt |
| ---- | ---- | ---- | ---- | ---- |
| English |   |   |   |   |
| one | Guangdong | 2018 | 1.3 | NaN |
| two | Beijing | 2018 | 2.5 | NaN |
| three | Qinghai | 2018 | 1.1 | NaN |
| four | Fujiang | 2018 | 0.7 | NaN |

- 通过shape属性获取DataFrame的行数和列数:


>**df2.shape**

代码结果:

>**(4, 4)**

- values属性也会以二维ndarray的形式返回DataFrame的数据:

>**df2.values**

代码结果:
```python
array([['Guangdong', 2018 , 1.3, nan],
       ['Beijing', 2018 , 2.5, nan],
       ['Qinghai', 2018 , 1.1, nan],
       ['Fujiang', 2018 , 0.7, nan]], dtype=object)
```

## 二、DataFrame对象常见存取、赋值和删除方式 ##

- DataFrame_object[ ] 能通过列索引来存取,当只有一个标签则返回Series,多于一个则返回DataFrame:

>**df2['Province']**

代码结果:
```python
English
one      Guangdong
two      Beijing
three      Qinghai
four       Fujiang
Name: Province, dtype: object
```

>**df2[['Province','pop']]**

代码结果:

| Province | Province | pop |
| ---- | ---- | ---- |
| English |   |   |
| one | Guangdong | 1.3 |
| two | Beijing | 2.5 |
| three | Qinghai | 1.1 |
| four | Fujiang | 0.7 |

- DataFrame_object.loc[ ] 能通过行索引来获取指定行:

>**df2.loc['one']**
```python
year             2018
Province    Guangdong
pop               1.3
debt            NaN
Name: one, dtype: object
```

>**df2.loc['one':'three']**

代码结果:

| Province | Province | year| pop | debt |
| ---- | ---- | ---- | ---- | ---- |
| English |   |   |   |   |
| one | Guangdong | 2018 | 1.3 | NaN |
| two | Beijing | 2018 | 2.5 | NaN |
| three | Qinghai | 2018 | 1.1 | NaN |

- 当然也可以取单值

>**df2.loc['one','Province']**

代码结果:
>**'Guangdong'**

- DataFrame的列可以通过赋值(一个值或一组值)来修改:

```python
df2["debt"]=np.arange(2,3,0.25)
df2
```
代码结果:

| Province | Province | year| pop | debt |
| ---- | ---- | ---- | ---- | ---- |
| English |   |   |   |   |
| one | Guangdong | 2018 | 1.3 | 2.00 |
| two | Beijing | 2018 | 2.5 | 2.25 |
| three | Qinghai | 2018 | 1.1 | 2.50 |
| four | Fujiang | 2018 | 0.7 | 2.75 |

- 为不存在的列赋值会创建一个新的列,可通过del来删除:

```python
df2['eastern']=None
df2
```
代码结果:

| Province | Province | year| pop | debt | eastern |
| ---- | ---- | ---- | ---- | ---- | ---- |
| English |   |   |   |   |
| one | Guangdong | 2018 | 1.3 | 2.00 | NaN |
| two | Beijing | 2018 | 2.5 | 2.25 | NaN |
| three | Qinghai | 2018 | 1.1 | 2.50 | NaN |
| four | Fujiang | 2018 | 0.7 | 2.75 | NaN

- 删除某列


```python
del df2['eastern']
df2.columns
```
代码结果:
>**Index(['year', 'Province', 'pop', 'debt'], dtype='object', name='Province')**

## 三、多种创建DataFrame方式 ##
- 调用DataFrame()可以将多种格式的数据转换为DataFrame对象,它的的三个参数data、index和columns分别为数据、行索引和列索引.data可以是:二维数组\字典\结构数组.

### 二维数组 ###
```python
df3=pd.DataFrame(np.random.randint(0,10,(4,4)),index=,columns=['A','B','C','D'])
df3
```
代码结果:

|| A | B | C| D |
| ---- | ---- | ---- | ---- | ---- |
| 1 | 6 | 7 | 6 | 8 |
| 2 | 2 | 8 | 4 | 5 |
| 3 | 1 | 4 | 5 | 4 |
| 4 | 4 | 2 | 9 | 0 |

### 字典 ###
值得注意的是行索引由index决定,列索引由字典的键决定
```python
dict1 = {'Province': ['Guangdong', 'Beijing', 'Qinghai', 'Fujiang'],
         'year': },
         'pop':
         
df4=pd.DataFrame(dict1,index=)
df4
```

代码结果:

|| Province | year| pop |
| ---- | ---- | ---- | ---- |
| 0 | Guangdong | 2018 | 1.3 |
| 1 | Beijing | 2018 | 2.5 |
| 2 | Qinghai | 2018 | 1.1 |
| 3 | Fujiang | 2018 | 0.7 |

### 结构数组 ###
其中列索引由结构数组的字段名决定
```python
arr=np.array([('item1',10),('item2',20),('item3',30),('item4',40)],dtype=[("name","10S"),("count",int)])
df5=pd.DataFrame(arr)
df5
```
dtype里面的"10S"表示array里面元素里面的第一个值字符串长度不能超过10,否则不能正常显示

代码结果:

|| name | count |
| ---- | ---- | ---- |
| 0 | b'item1' | 10 |
| 1 | b'item2' | 20 |
| 2 | b'item3' | 30 |
| 3 | b'item4' | 40 |

## 四、将DataFrame对象转换为其他格式的数据 ##
- to_dict()方法将DataFrame对象转换为字典,参数orient决定字典元素的类型:

```python
df3.to_dict()
#代码结果:
{'A': {1: 6, 2: 2, 3: 1, 4: 4},
'B': {1: 7, 2: 8, 3: 4, 4: 2},
'C': {1: 6, 2: 4, 3: 5, 4: 9},
'D': {1: 8, 2: 5, 3: 4, 4: 0}}
```
```python
df3.to_dict(orient="records")
#代码结果:
[{'A': 6, 'B': 7, 'C': 6, 'D': 8},
{'A': 2, 'B': 8, 'C': 4, 'D': 5},
{'A': 1, 'B': 4, 'C': 5, 'D': 4},
{'A': 4, 'B': 2, 'C': 9, 'D': 0}]
```
```python
df3.to_dict(orient="list")
#代码结果:
{'A': , 'B': , 'C': , 'D': }
```
- 类似的还有to_records()、to_csv()等

# Index #
Index对象保存着索引标签数据,它可以快速找到标签对应的整数下标,其功能与Python的字典类似

```python
dict1={"Province":["Guangdong","Beijing","Qinghai","Fujiang"],
      "year":*4,
      "pop":}
df1=DataFrame(dict1)
df1
```
代码结果

|| Province | year| pop |
| ---- | ---- | ---- | ---- |
| 0 | Guangdong | 2018 | 1.3 |
| 1 | Beijing | 2018 | 2.5 |
| 2 | Qinghai | 2018 | 1.1 |
| 3 | Fujiang | 2018 | 0.7 |

- 调用.columns返回DataFrame对象的列索引即所有列标签


```python
col_index=df1.columns
col_index.values

代码结果
array(['Province', 'pop', 'year'], dtype=object)
```
- 同理.index也是一样的


```python
ind_index=df1.index
ind_index.values

#代码结果
array(, dtype=int64)
```

- Index对象可当做一维数组,适合Numpy数组的下标运算,但Index对象只是可读,创建后不可修改

```python
print(col_index[])
print(ind_index)

#代码结果
Index(['pop', 'year'], dtype='object')
Int64Index(, dtype='int64')
```

- index对象具有字典的映射功能,.get_loc(value)获得单值得下标,.get_indexer(values)获得一组值得下标,当值不存在则返回-1:

```python
print(col_index.get_loc('pop'))
print(col_index.get_indexer(['pop','year']))

#代码结果
1

```
- Index对象调用Index()来创建,可传递给DataFrame对象的参数index和columns。因为Index是不可变的,因此多个DataFrame对象的索引可以是同个Index对象


```python
index=pd.Index(['a','b','c'])
df2=DataFrame(np.random.randint(1,10,(3,3)),index=index,columns=index)
df2
```
代码结果

|| a | b | c |
| ---- | ---- | ---- | ---- |
| a | 4 | 1 | 2 |
| b | 2 | 1 | 4 |
| c | 5 | 2 | 0 |

# MultiIndex #
MultiIndex表示多级索引,它是从Index继承过来的,其中多级标签用元组对象来表示

## 一、创建MultiIndex对象 ##


### 创建方式一:元组列表 ###
```python
m_index1=pd.Index([("A","x1"),("A","x2"),("B","y1"),("B","y2"),("B","y3")],name=["class1","class2"])
m_index1

代码结果
MultiIndex(levels=[['A', 'B'], ['x1', 'x2', 'y1', 'y2', 'y3']],
         labels=[, ],
         names=['class1', 'class2'])

df1 = Dataframe(np.random.randint(1,10,(5,3)),index = m_inex1)
df1
```
代码结果
![](https://syjun.vip/image/MulitIndex/1.png)

### 创建方式二:特定结构 ###
```python
class1=["A","A","B","B"]
class2=["x1","x2","y1","y2"]
m_index2=pd.MultiIndex.from_arrays(,names=["class1","class2"])
m_index2

代码结果
MultiIndex(levels=[['A', 'B'], ['x1', 'x2', 'y1', 'y2']],
         labels=[, ],
         names=['class1', 'class2'])

df2=DataFrame(np.random.randint(1,10,(4,3)),index=m_index2)
df2
```
代码结果
![](https://syjun.vip/image/MulitIndex/2.png)

### 创建方式三:笛卡尔积 ###
.from_product()从多个集合的笛卡尔积创建MultiIndex对象
```python
m_index3=pd.MultiIndex.from_product([["A","B"],['x1','y1']],names=["class1","class2"])
m_index3

代码结果
MultiIndex(levels=[['A', 'B'], ['x1', 'y1']],
         labels=[, ],
         names=['class1', 'class2'])

df3 = pd.DataFrame(np.random.randint(1,10,(2,4)),columns = m_index3)
```
![](https://syjun.vip/image/MulitIndex/3.1.png)

## MultiIndex对象属性 ##

我们再来看一下df1的结构
![](https://syjun.vip/image/MulitIndex/1.png)

- 如何获取到单个元素


```python
df1.loc[('A','x1'),2]

代码结果
2
```
- 通过索引下标取索引值


```python
m_index4=df1.index
print(m_index4)

代码结果
('A', 'x1')
```
- 调用.get_loc()和.get_indexer()获取标签的下标


```python
print(m_index4.get_loc(("A","x2")))
print(m_index4.get_indexer([("A","x2"),("B","y1"),"nothing"]))

代码结果
1
[ 12 -1]
```
- MultiIndex对象使用多个Index对象保存索引中每一级的标签


```python
print(m_index4.levels)
print(m_index4.levels)

代码结果
Index(['A', 'B'], dtype='object', name='class1')
Index(['x1', 'x2', 'y1', 'y2', 'y3'], dtype='object', name='class2')
```

- MultiIndex对象还有属性labels保存标签的下标

```python
print(m_index4.labels)
print(m_index4.labels)

代码结果
FrozenNDArray(, dtype='int8')
FrozenNDArray(, dtype='int8')
```

个人博客(https://syjun.vip)
**世界因代码而改变 Peace Out**

正己 发表于 2020-9-24 21:13

沙发有吗?

doctrinist 发表于 2020-9-24 21:33

涨知识了!

深水夜藏 发表于 2020-9-24 21:39

感谢分享,学习了

苍北语 发表于 2020-9-24 22:49

感谢分享

feiyu361 发表于 2020-9-25 16:55

谢谢分享,我终于学废了

吾爱师姐! 发表于 2020-9-26 09:06

楼主我又来了!!!

Java_S 发表于 2020-9-26 09:19

吾爱师姐! 发表于 2020-9-26 09:06
楼主我又来了!!!

哈哈哈 爱了爱了

吾爱师姐! 发表于 2020-9-26 10:02

Java_S 发表于 2020-9-26 09:19
哈哈哈 爱了爱了

楼主正则匹配有更新计划吗?等了很久了额{:1_899:}

Java_S 发表于 2020-9-26 11:28

吾爱师姐! 发表于 2020-9-26 10:02
楼主正则匹配有更新计划吗?等了很久了额

可能不会更新了 最近忙着准备比赛 不好意思了
页: [1]
查看完整版本: Pandas笔记之四大重要对象