소개
빅 데이터의 하이브가 용칼이라면 Pandas는 데이터 마이닝, 데이터 분석 및 데이터 정리에 도움 이되는 검입니다 .
이 글은 Pandas의 기본적인 문법과 사용법을 소개합니다. 수집하는 것이 좋습니다 ~
목차
- 데이터 준비
-
데이터 프레임 기본 작업
2.1보기
2.2 수정
2.3 필터
2.4 정렬
2.5 중복 제거
2.6 집계
2.7 연관
2.8 사용자 정의 기능
2.9 인덱스 연산
2.10 널 값 처리
2.11 to_csv 쓰기 csv 파일
1. 데이터 준비
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'])
데이터 미리보기 :
site_id | 사용자 이름 | pv | dt |
---|---|---|---|
A10 | 존 | 2 | 20200801 |
A10 | 웨일스 말 | 삼 | 20200801 |
A10 | 존 | 16 | 20200801 |
A10 | Albert | 20 | 20200802 |
A10 | GG | 32 | 20200801 |
A20 | Albert | 42 | 20200801 |
A20 | 웨일스 말 | 10 | 20200801 |
A20 | 웨일스 말 | 15 | 20200802 |
A10 | Albert | 20 | 20200801 |
A20 | 존 | NaN | 20200802 |
A20 | 웨일스 말 | 15 | 20200802 |
A20 | Albert | 10 | 20200802 |
A10 | 조조 | 16 | 20200802 |
A20 | 웨일스 말 | 35 | 20200803 |
A10 | 웨일스 말 | 33 | 20200803 |
A20 | 존 | 66 | 20200803 |
A20 | 조조 | 15 | 20200802 |
A10 | Albert | 53 | 20200803 |
A10 | 조조 | 12 | 20200803 |
A20 | GG | 35 | 20200803 |
A20 | JK | 30 | 20200803 |
매장 미리보기 : |
site_id | 사용자 이름 |
---|---|---|
A02 | 베이징 동 직문 | |
A10 | 베이징 조양문 점 | |
A06 | 베이징 류리 차오 스토어 | |
A20 | 베이징 시황 춘점 |
2. 데이터 프레임 기본 작업
Pandas의 데이터 프레임 구조는 실제로 mysql 구조와 유사한 열, 행 및 인덱스로 구성된 2 차원 배열입니다.
주로 테이블 보기, 수정, 필터링, 정렬, 집계, 연결 및 null 값 처리에 대한 몇 가지 기본 문법을 소개합니다.
2.1보기
- 열은 열 이름을 얻습니다.
df.columns
# 输出:
Index(['site_id', 'user_name', 'pv', 'dt'], dtype='object')
-
색인 색인 가져 오기
df.index # 输出: MultiIndex([( 0,), ( 1,), ( 2,), ( 3,), ... (19,), (20,)], )
-
값 데이터 가져 오기
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)
-
dtypes보기 유형
df.dtypes # 输出: site_id object user_name object pv object dt object dtype: object
참고 : 두 테이블을 연결할 때 연결된 두 필드의 유형이 동일한 지 확인해야하는 경우가 많습니다. 불일치가 발생하면 astype 변환이 필요합니다. 예 : df [ "dt"] = df [ "dt"]. astype ( "int64" )
-
머리가
df.head(2) # 展示头2行 # 输出: site_id user_name pv dt 0 A10 Sone Sone 20200801 1 A10 welsh welsh 20200801
- 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 [:, [ 'name', 'pv']] # 다중 열 표시
산출:
user_name pv
0 소네 2
1 웨일스 어 3
2 소네 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
-
열 및 행 전체 통계 형성
df.shape # 输出21列,4行 # 输出: (21, 4)
- 통계 열을 세다
df.pv.count() # 输出: 20
설명 : count ()로 계산 된 총계에 NaN이 포함되지 않습니다.
2.2 수정
-
열 수정 이름 바꾸기
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
참고 : 원래 테이블 에 다시 할당해야합니다 . 원래 테이블 값이 적용됩니다. df = df.rename (columns = { 'pv': 'page_view'})
-
드롭 컬럼 제거
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
참고 : 원래 테이블 에 다시 할당해야합니다 . 원래 테이블 값이 적용됩니다. df = df.drop ([ 'dt'], axis = 1)
- df [ 'xx'] 행 추가
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 필터
-
df [xx> x] 단일 조건 필터
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
- 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 정렬
- sort_values 값을 기준으로 정렬
df.sort_values(by=["pv"],ascending=False) # pv 倒叙
산출:
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 welsh 3.0 20200801
0 A10 Sone 2.0 20200801
9 A20 Sone NaN 20200802
df.sort_values (by = [ "pv"], ascending = True) # pv 正 序
산출:
site_id user_name pv dt
0 A10 Sone 2.0 20200801
1 A10 welsh 3.0 20200801
11 A20 Albert 10.0 20200802
6 A20 welsh 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
참고 : 집계 할 때 색인이 순서가 맞지 않으므로 색인 기반 정렬을 사용해야합니다.
2.5 중복 제거 통계
- 특정 열을 기반으로 한 고유 한 중복 제거
df.groupby('site_id').agg({'user_name': pd.Series.nunique}) # A10下5个用户,A20下6个用户
산출:
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
설명 : 집계 함수 지원 : count () | min () | max () | avg () | meav () | std () | var (), 비 NaN 데이터 계산
- groupby ([ 'xx', 'yy']). agg 다중 열 집계 기반
df.groupby(['site_id','user_name']).agg({'pv': 'sum','dt':'count'})
산출:
pv dt
site_id user_name
A10 Albert 93.0 3
GG 32.0 1
Jojo 28.0 2
Sone 18.0 2
welsh 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
welsh 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는 인덱스 연관을 기반으로합니다.
df = df.groupby("site_id").count() df= pd.merge(df,site,how='inner',left_index=True,right_on="site_id")
산출:
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
- 방법 2 : 사용자 지정 함수
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)
산출:
site_id user_name pv dt pv_dt
0 A10 소네 2.0 20200801 2.0_20200801
1 A10 웨일스 어 3.0 20200801 3.0_20200801
2 A10 소네 16.0 20200801 16.0_20200801
...
18 A10 조조 12.0 20200803 12.0_20200803
19 A20 GG 35.0 20200803 35.0_20200803
20 A20 JK 30.0_20
### 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 열은 인덱스로 지정됩니다.
df.set_index("site_id")
산출:
user_name pv dt
site_id
A10 소네 2.0 20200801
A10 웨일스 어 3.0 20200801
A10 소네 16.0 20200801
...
A20 조조 15.0 20200802
A10 알버트 53.0 20200803
A10 조조 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 () null이 아닌 통계, True는 열에 null이 아닌 값이 포함되어 있음을 나타내고, false는 열이 모두 null 값임을 나타냅니다.
df.notnull().any()
산출:
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 쓰기 csv 파일
df.to_csv("pv.csv")
3. 시리즈 기본 작동
Pandas Series 구조는 실제로보기, 통계, 필터링 및 집계에서 단일 열 mysql 테이블 구조와 유사한 열과 인덱스로 구성된 1 차원 배열입니다.
3.1보기
- 헤드 뷰
user_name = df['user_name'] user_name.head(2)
산출:
0 소네
1 웨일스 어
이름 : user_name, dtype : object
### 3.2 统计
1. shape 行统计
```python
user_name = df['user_name']
user_name.shape
# 输出:
(21,)
3.3 필터
- df [xx == 'x']
user_name = df['user_name'] user_name[user_name=='Sone']
산출:
0 소네
2 소네
9 소네
15 소네
이름 : user_name, dtype : object
### 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 집계
user_name = df['user_name']
user_name.count()
# 输出:
21
3.6 널 값 처리
- isnull () null 값 통계
pv = df['pv'] pv.isnull().sum()
산출:
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
내 WeChat 공개 계정 팔로우 [Data Ape Wen Da]
pandas 공식 문서의 중국어 버전 받기