Introdução
Se a colméia em big data é uma faca de dragão, então o pandas é uma espada que nos ajuda na mineração de dados, análise de dados e limpeza de dados .
Este artigo apresenta algumas habilidades básicas de gramática e uso de Pandas, é recomendado coletar ~
índice
- preparação de dados
-
Operações básicas do Dataframe
2.1 Ver
2.2 Modificação
2.3 Filtro
2.4 Classificar
2.5 Deduplicação
2.6 Agregação
2.7 Associação
2.8 Funções personalizadas
2.9 Operação de índice
2.10 Processamento de valor nulo
2.11 to_csv escrever arquivo csv
1. Preparação de dados
Execute o seguinte script na plataforma Python IDE:
import pandas as pd
import numpy as np
df=pd.DataFrame([['A10','Sone',2,'20200801'],
['A10','welsh',3,'20200801'],['A10','Sone',16,'20200801'],['A10','Albert',20,'20200802'],
['A10','GG',32,' 20200801'],['A20','Albert',42,' 20200801'],['A20','welsh',10,'20200801'],['A20','welsh',15,'20200802'],['A10','Albert',20,'20200801'],['A20','Sone',np.NaN,'20200802'],['A20','welsh',15,'20200802'],['A20','Albert',10,'20200802'],['A10','Jojo',16,'20200802'],
['A20','welsh',35,'20200803'],['A10','welsh',33,'20200803'],['A20','Sone',66,'20200803'],
['A20','Jojo',15,'20200802'],['A10','Albert',53,'20200803'],['A10','Jojo',12,'20200803'],
['A20','GG',35,'20200803'],['A20','J.K',30,'20200803']
],index=[[x for x in range(21)]], columns=['site_id','user_name','pv','dt'])
site=pd.DataFrame([['A02','北京东直门'],['A10','北京朝阳门店'],['A06','北京六里桥店'],['A20','北京西黄村店']],
index=[[x for x in range(4)]],columns=['site_id','site_name'])
Visualização de dados:
ID do site | nome do usuário | pv | dt |
---|---|---|---|
A10 | Zona | 2 | 20200801 |
A10 | galês | 3 | 20200801 |
A10 | Zona | 16 | 20200801 |
A10 | Albert | 20 | 20200802 |
A10 | GG | 32 | 20200801 |
A20 | Albert | 42 | 20200801 |
A20 | galês | 10 | 20200801 |
A20 | galês | 15 | 20200802 |
A10 | Albert | 20 | 20200801 |
A20 | Zona | NaN | 20200802 |
A20 | galês | 15 | 20200802 |
A20 | Albert | 10 | 20200802 |
A10 | Jojo | 16 | 20200802 |
A20 | galês | 35 | 20200803 |
A10 | galês | 33 | 20200803 |
A20 | Zona | 66 | 20200803 |
A20 | Jojo | 15 | 20200802 |
A10 | Albert | 53 | 20200803 |
A10 | Jojo | 12 | 20200803 |
A20 | GG | 35 | 20200803 |
A20 | JK | 30 | 20200803 |
Visualização da loja: |
ID do site | nome do usuário |
---|---|---|
A02 | Pequim Dongzhimen | |
A10 | Loja de Chaoyangmen de Pequim | |
A06 | Loja Pequim Liuliqiao | |
A20 | Loja Xihuangcun de Pequim |
2. Operações básicas do Dataframe
A estrutura Dataframe do Pandas é na verdade uma matriz bidimensional que consiste em colunas, linhas e índices, semelhante à estrutura mysql.
Ele apresenta principalmente algumas gramáticas básicas de visualização, modificação, filtragem, classificação, agregação, associação e processamento de valor nulo de tabelas .
2.1 Ver
- colunas recebem o nome da coluna
df.columns
# 输出:
Index(['site_id', 'user_name', 'pv', 'dt'], dtype='object')
-
índice Obter índice
df.index # 输出: MultiIndex([( 0,), ( 1,), ( 2,), ( 3,), ... (19,), (20,)], )
-
valores Obter dados
df.values # 输出: array([['A10', 'Sone', 2, '20200801'], ['A10', 'welsh', 3, '20200801'], ['A10', 'Sone', 16, '20200801'], ['A10', 'Albert', 20, '20200802'], ... ['A10', 'Jojo', 12, '20200803'], ['A20', 'GG', 35, '20200803'], ['A20', 'J.K', 30, '20200803']], dtype=object)
-
tipo de visualização dtypes
df.dtypes # 输出: site_id object user_name object pv object dt object dtype: object
Observações: Ao associar entre 2 tabelas, muitas vezes é necessário confirmar se os tipos dos 2 campos associados são iguais. Quando houver inconsistências, a conversão de astype é necessária, por exemplo: df ["dt"] = df ["dt"]. Astype ("int64" )
-
cabeça pegar
df.head(2) # 展示头2行 # 输出: site_id user_name pv dt 0 A10 Sone Sone 20200801 1 A10 welsh welsh 20200801
- exibição de coluna df.xx / loc
df.name # 单列展示 # 输出: 0 Sone 1 welsh 2 Sone ... 18 Jojo 19 GG 20 J.K Name: user_name, dtype: object
df.loc [:, ['nome', 'pv']] # Exibição de várias colunas
Resultado:
user_name pv
0 Sone 2
1 galês 3
2 Sone 16
...
19 GG 35
20 JK 30
7. iloc 行查看
```python
df.iloc[[0,1,8],] # 展示index为0、1、8的行
# 输出:
site_id user_name pv dt
0 A10 Sone 2 20200801
1 A10 welsh 3 20200801
8 A10 Albert 20 20200801
-
Estatísticas gerais de coluna e linha de forma
df.shape # 输出21列,4行 # 输出: (21, 4)
- conte uma coluna de estatísticas
df.pv.count() # 输出: 20
Explicação: O total contado por contagem () não inclui NaN
2.2 Modificação
-
renomear uma modificação de coluna
df.rename(columns={'pv': 'page_view'}) # 输出: site_id user_name page_view dt 0 A10 Sone 2.0 20200801 1 A10 welsh 3.0 20200801 2 A10 Sone 16.0 20200801 ... 19 A20 GG 35.0 20200803 20 A20 J.K 30.0 20200803
Observação: você precisa reatribuir à tabela original , o valor da tabela original entrará em vigor, df = df.rename (colunas = {'pv': 'page_view'})
-
remova a coluna suspensa
df.drop(['dt'], axis=1) # 输出: site_id user_name pv 0 A10 Sone 2.0 1 A10 welsh 3.0 2 A10 Sone 16.0 3 A10 Albert 20.0 ... 19 A20 GG 35.0 20 A20 J.K 30.0
Observação: você precisa reatribuir à tabela original , o valor da tabela original entrará em vigor, df = df.drop (['dt'], axis = 1)
- df ['xx'] Adicionar uma linha
df['copy_dt']=df['dt'] # 新增df['copy_dt']列,复制['dt']这列而来 df # 输出: site_id user_name pv dt copy_dt 0 A10 Sone 2.0 20200801 20200801 1 A10 welsh 3.0 20200801 20200801 2 A10 Sone 16.0 20200801 20200801 ... 19 A20 GG 35.0 20200803 20200803 20 A20 J.K 30.0 20200803 20200803
2.3 Filtro
-
df [xx> x] Filtro de condição única
df[df.pv>30] # pv值大于30的数据 # 输出: site_id user_name pv dt 4 A10 GG 32.0 20200801 5 A20 Albert 42.0 20200801 13 A20 welsh 35.0 20200803 14 A10 welsh 33.0 20200803 15 A20 Sone 66.0 20200803 17 A10 Albert 53.0 20200803 19 A20 GG 35.0 20200803
- filtragem de condições múltiplas df [(xx> x) & (yy == y)]
df["dt"] = df["dt"].astype("int64") # 先将dt转换成int64类型 df[(df.pv>30) & (df.dt==20200801)] # 过滤出pv>30 且 dt是0801这天的 # 输出: site_id user_name pv dt 4 A10 GG 32.0 20200801 5 A20 Albert 42.0 20200801
2.4 Classificar
- sort_values classifica com base em valores
df.sort_values(by=["pv"],ascending=False) # pv 倒叙
Resultado:
site_id user_name pv dt
15 A20 Sone 66,0 20200803
17 A10 Albert 53,0 20200803
5 A20 Albert 42,0 20200801
19 A20 GG 35,0 20200803
...
1 A10 galês 3.0 20200801
0 A10 Sone 2.0 20200801
9 A20 Sone NaN 20200802
df.sort_values (por = ["pv"], ascendente = Verdadeiro) # pv 正 序
Resultado:
site_id user_name pv dt
0 A10 Sone 2.0 20200801
1 A10 galês 3,0 20200801
11 A20 Albert 10,0 20200802
6 A20 galês 10,0 20200801
...
17 A10 Albert 53,0 20200803
15 A20 Sone 66,0 20200803
9 A20 Sone NaN 20200802
说明:pv是null的数据,无论是正序还是倒叙均排在最后,**进行排序时需要先进行null值处理**
2. sort_index 基于index排序
```python
df=df.sort_index(axis=0)
# 输出:
site_id user_name pv dt
0 A10 Sone 2.0 20200801
1 A10 welsh 3.0 20200801
2 A10 Sone 16.0 20200801
...
19 A20 GG 35.0 20200803
20 A20 J.K 30.0 20200803
Nota: Quando agregamos, o índice fica fora de ordem , então precisamos usar a classificação baseada em índice para esses
2.5 Estatísticas de desduplicação
- deduplicação única com base em uma determinada coluna
df.groupby('site_id').agg({'user_name': pd.Series.nunique}) # A10下5个用户,A20下6个用户
Resultado:
user_name
site_id
A10 5
A20 6
### 2.6 聚合
1. groupby('xx') 基于单列聚合
```python
df.groupby('site_id').count()
# 输出:
user_name pv dt
site_id
A10 10 10 10
A20 11 10 11
df.groupby('site_id').min()
# 输出:
user_name pv dt
site_id
A10 Albert 2.0 20200801
A20 Albert 10.0 20200801
df.groupby('site_id').max()
# 输出:
user_name pv dt
site_id
A10 welsh 53.0 20200803
A20 welsh 66.0 20200803
Descrição: suporte de função agregada: contagem () | min () | max () | avg () | meav () | std () | var (), para calcular dados não NaN
- groupby (['xx', 'yy']). agg com base na agregação de várias colunas
df.groupby(['site_id','user_name']).agg({'pv': 'sum','dt':'count'})
Resultado:
pv dt
site_id user_name
A10 Albert 93,0 3
GG 32,0 1
Jojo 28,0 2
Sone 18,0 2
galês 36,0 2
A20 Albert 52,0 2
GG 35,0 1
J.K 30,0 1
Jojo 15,0 1
Sone 66,0 2
galês 75,0 4
### 2.7 关联
1. merge 基于字段关联
```python
df= pd.merge(df,site,how='inner',on='site_id')
# 输出:
site_id user_name pv dt site_name
0 A10 Sone 2.0 20200801 北京朝阳门店
1 A10 welsh 3.0 20200801 北京朝阳门店
...
19 A20 GG 35.0 20200803 北京西黄村店
20 A20 J.K 30.0 20200803 北京西黄村店
- left_index é baseado na associação de índice
df = df.groupby("site_id").count() df= pd.merge(df,site,how='inner',left_index=True,right_on="site_id")
Resultado:
user_name pv dt site_id site_name
1 10 10 10 A10 Beijing Chaoyangmen Store
3 11 10 11 A20 Beijing Xihuangcun Store
说明: 表A基于site_id字段进行聚合后,然后site_id字段变成表A的index,然后表A的index与表B的字段site_id在进行聚合,最终带出site_name
### 2.8 自定义函数
1. 例如我们想将 pv 与 dt字段进行拼接后生成,可以用apply 之 lambda 函数实现
```python
df['pv']=df['pv'].astype("str") # pv字段转成str
df['dt']=df['dt'].astype("str") # dt字段转成str
df['pv_dt'] = df.apply(lambda r:(r['pv'] +"_"+ r['dt']),axis=1) # 将pv与dt进行拼接
# 输出:
site_id user_name pv dt pv_dt
0 A10 Sone 2.0 20200801 2.0_20200801
1 A10 welsh 3.0 20200801 3.0_20200801
2 A10 Sone 16.0 20200801 16.0_20200801
...
18 A10 Jojo 12.0 20200803 12.0_20200803
19 A20 GG 35.0 20200803 35.0_20200803
20 A20 J.K 30.0 20200803 30.0_20200803
- Método dois, função personalizada
def str_split(sub_pdf:pd.DataFrame): sub_pdf['pv_dt'] = sub_pdf['pv']+"_"+sub_pdf['dt'] return sub_pdf
df ['ab_pro'] = df.apply (str_split, axis = 1)
Resultado:
site_id user_name pv dt pv_dt
0 A10 Sone 2.0 20200801 2.0_20200801
1 A10 welsh 3.0 20200801 3.0_20200801
2 A10 Sone 16.0 20200801 16.0_20200801
...
18 A10 Jojo 12.0 20200803 12.0_20200803
19 A20 GG 35.0 20200803 35.0_20200803
20 A20 JK 30.0
### 2.9 索引操作
1. reset_index 重排序索引,一般是针对聚合后的数据,对其索引进行重排
```python
df = df.groupby("user_name").count() # 此时索引是user_name
# 输出:
site_id pv dt
user_name
Albert 5 5 5
GG 2 2 2
J.K 1 1 1
Jojo 3 3 3
Sone 4 3 4
welsh 6 6 6
df.reset_index('user_name')
# 输出:
user_name site_id pv dt # 重排后的索引
0 Albert 5 5 5
1 GG 2 2 2
2 J.K 1 1 1
3 Jojo 3 3 3
4 Sone 4 3 4
5 welsh 6 6 6
- set_index uma coluna é designada como um índice
df.set_index("site_id")
Resultado:
user_name pv dt
site_id
A10 Sone 2.0 20200801
A10 welsh 3.0 20200801
A10 Sone 16.0 20200801
...
A20 Jojo 15.0 20200802
A10 Albert 53.0 20200803
A10 Jojo 12.0 20200803
### 2.10 空值处理
1. isnull() 空值统计,True表示该列含有空值,false表示该列不含空值,通常与any()看哪些列是空值,sum()看各列空值的数量
```python
df.isnull().any() # 统计
# 输出:
site_id False
user_name False
pv True
dt False
dtype: bool
df.isnull().sum()
# 输出:
site_id 0
user_name 0
pv 1
dt 0
dtype: int64
- notnull () estatísticas não nulas, True indica que a coluna contém valores não nulos, false indica que a coluna contém todos os valores nulos,
df.notnull().any()
Resultado:
site_id True
user_name True
pv True
dt True
dtype: bool
3. 空值填充, Sone的pv值被填充为0
```python
df['pv'] = df.pv.fillna(0)
df
# 输出:
site_id user_name pv dt
0 A10 Sone 2.0 20200801
1 A10 welsh 3.0 20200801
..
9 A20 Sone 0.0 20200802
...
20 A20 J.K 30.0 20200803
2.11 to_csv escrever arquivo csv
df.to_csv("pv.csv")
3. Operações básicas da série
A estrutura da série Pandas é, na verdade, uma matriz unidimensional composta de colunas e índices, semelhante a uma estrutura de tabela mysql de coluna única, desde visualização, estatísticas, filtragem e agregação.
3.1 Ver
- vista de cabeça
user_name = df['user_name'] user_name.head(2)
Resultado:
0 Sone
1 welsh
Nome: user_name, dtype: object
### 3.2 统计
1. shape 行统计
```python
user_name = df['user_name']
user_name.shape
# 输出:
(21,)
3.3 Filtro
- df [xx == 'x']
user_name = df['user_name'] user_name[user_name=='Sone']
Resultado:
0 Sone
2 Sone
9 Sone
15 Sone
Nome: user_name, dtype: objeto
### 3.4 排序
1. sort_values
```python
user_name = df['user_name']
user_name.sort_values()
# 输出:
17 Albert
3 Albert
5 Albert
8 Albert
...
13 welsh
14 welsh
7 welsh
6 welsh
1 welsh
10 welsh
Name: user_name, dtype: object
3,5 agregação
user_name = df['user_name']
user_name.count()
# 输出:
21
3.6 Processamento de valor nulo
- isnull () estatísticas de valor nulo
pv = df['pv'] pv.isnull().sum()
Resultado:
1
2. fillna(0)空值统计
```python
pv = df['pv']
pv = pv.fillna(0)
# 输出:
0 2.0
...
9 0.0
...
20 30.0
Name: pv, dtype: float64
Siga minha conta pública do WeChat [Data Ape Wen Da]
Obtenha a versão chinesa da documentação oficial do pandas