팬더를 얻을 수있는 기사, 수집하는 것이 좋습니다!

소개

빅 데이터의 하이브가 용칼이라면 Pandas는 데이터 마이닝, 데이터 분석 및 데이터 정리에 도움 이되는 검입니다 .

이 글은 Pandas의 기본적인 문법과 사용법을 소개합니다. 수집하는 것이 좋습니다 ~

목차

  1. 데이터 준비
  2. 데이터 프레임 기본 작업

    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보기

  1. 열은 열 이름을 얻습니다.
df.columns  
# 输出:
Index(['site_id', 'user_name', 'pv', 'dt'], dtype='object')
  1. 색인 색인 가져 오기

    df.index   
    # 输出:
    MultiIndex([( 0,),
            ( 1,),
            ( 2,),
            ( 3,),
            ...
            (19,),
            (20,)],
           )
  2. 값 데이터 가져 오기

    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)
  3. dtypes보기 유형

    df.dtypes   
    # 输出:
    site_id      object
    user_name    object
    pv           object
    dt           object
    dtype: object

    참고 : 두 테이블을 연결할 때 연결된 두 필드의 유형이 동일한 지 확인해야하는 경우가 많습니다. 불일치가 발생하면 astype 변환이 필요합니다. 예 : df [ "dt"] = df [ "dt"]. astype ( "int64" )

  4. 머리가

    df.head(2) # 展示头2行
    # 输出:
    site_id user_name   pv  dt
    0   A10 Sone    Sone    20200801
    1   A10 welsh   welsh   20200801
  5. 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
  1. 열 및 행 전체 통계 형성

    df.shape  # 输出21列,4行
    # 输出:
    (21, 4)   
  2. 통계 열을 세다
    df.pv.count()   
    # 输出:
    20

    설명 : count ()로 계산 된 총계에 NaN이 포함되지 않습니다.

2.2 수정

  1. 열 수정 이름 바꾸기

    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'})

  2. 드롭 컬럼 제거

    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)

  3. 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 필터

  1. 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
  2. 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 정렬

  1. 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 중복 제거 통계

  1. 특정 열을 기반으로 한 고유 한 중복 제거
    
    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 데이터 계산

  1. 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    北京西黄村店
  1. 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
  1. 방법 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
  1. 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
  1. 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보기

  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 필터

  1. 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 널 값 처리

  1. 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 공식 문서의 중국어 버전 받기

팬더를 얻을 수있는 기사, 수집하는 것이 좋습니다!

추천

출처blog.51cto.com/14974545/2543117