Day 05 : 资料处理 Pandas (1)

excel 是很多人常用来处理报表与数据的工具,同样地在 python 也有一个套件常常在处理这件事,就是我们今天的主角 Pandas。这个工具是很多人在做 python 资料分析的探索工具,有必要好好地学习熊猫!

导入套件

安装方式

pandas 为第三方套件库,记得先安装後,通常还会安装相依的套件库 numpy

pip install numpy
pip install pandas

导入方式

numpy 和 pandas 均需要导入;大部分人习惯缩写用 np 和 pd

import numpy as np
import pandas as pd

资料结构

Series

类似 list 的资料结构,可以自订索引,是一个有索引值的一维阵列

s1 = pd.Series([0, 1, 2])
s1
s2 = pd.Series([0, 1, 2], index=[2, 7, 9])
s2

有属性 values 和 index,可以使用

DataFrame

类似 excel 的资料结构,一样有索引值,是有索引值的二维阵列。由於大家处理的资料大部分会是二维阵列,我会着重介绍 DataFrame 的操作。

创造数据

外部汇入

可以使用 csv、excel等等,每个方法可能有不同的默认值,使用者根据不同资料的格式进行参数调整。

df1 = pd.read_csv('file_path', header=1)
df2 = pd.read_excel('file_path', header=1)

自行创资料

当然也可以自己创建资料,会与 dict 搭配使用。 Dataframe 的格式就像 excel 一样有行有列。

df1 = pd.DataFrame({"id": [0, 1, 2],
                    "student": ["Erik", "David", "Mary"],
                    "score": [85, 100, 70]})
df1

查看资料表

实际资料

拿到一个资料的时候,应该要先查看资料的实际状况

# 不输入数字预设查看5笔
df.head()
df.head(100)
df.tail()
# 显示全部,但有时候会因为资料太多而被 pandas 用 ... 表示
df

预设浏览

後面的 None 是表示显示全部,也可以更改为正整数
详细请参考

  • 设定 column 显示数量
    pd.set_option('display.max_columns', None)
    
  • 设定 column 宽度
    pd.set_option("max_colwidth", None)
    
  • 设定 row 显示数量
    pd.set_option("max_rows", None)
    

查询资料表讯息

可以得知该资料表的整理资讯,包含 not-null、资料维度、格式和所占空间等等

df.info()


这边要顺便提醒 excel 转 pandas 时,有些资料格式的转换如果不是非预期,可能造成资料处理错误。因此需要先看看所有的栏位是不是有问题哦!

资料表基本操作

栏位

写栏位的时候可以用中括号或是一点再加上名称,但提醒一点加上名称的方法可能会因为 df 有其他保留关键字而无法使用成功,中文也是不能用一点加上名称。以下 dtypes 就是刚好 df 也有这个属性会跟 df 本身的栏位可能会打架。

# 回传 df 的 dtypes 栏位
df['dtypes']
# 回传 df 的 dtypes 属性
df.dtypes
# 回传 df 的 名称 栏位
df['名称']
# 不能使用
df.名称 

呼叫栏位

呼叫栏位名称之後,通常会在转成 list 以方便进行之後的操作

df.columns.tolist()

更改列名称

key 值是旧名称;value 值是新名称

df.rename(columns={"Age": "new_age"})

资料维度

若要使用其中一个数据,可以搭配索引值,例如我想知道资料笔数就可以 df.shape[0],当然也可以直接用 len(df)

df.shape
>>> (891, 12)

重设索引值

如果有调整顺序,通常会再重设索引值,避免之後回圈顺序有错等等

df.reset_index(inplace=True)

指定索引值的资料

loc 前面是索引值,後面会接明确的文字

df.loc[0 ,'Age']

iloc 前後都会接索引值

df.iloc[0, 7]

资料操作

空值检查

资料表会回传每个数据是否为空值的布林值(另外也可以用 notnull() )

df.isnull()


或是检查特定栏位

df['Age'].isnull()

加总用法

df['Age'].isnull().sum()

查看空值的方法

df[df['Age'].isnull()]

资料清洗

只要那一行有空值就会被踢掉

df.drop(how='any')

填充空值的方法,fillna 里面放 Age 的平均值

value = df.Age.mean()
df.Age.fillna(value)

找重复值

删除重复值,默认是保留第一笔看到的资料

df.Age.drop_duplicates()

资料计算

df.Sex.value_counts()

数据修改

可以简单的全部加上某个数值

df['Age'] = df['Age'] + 1 

替换方法

df['Sex'] = df['Sex'].replace('male', 'M') 

使用 lambda 匿名函数达到更换的功效

df['Sex'] = df['Sex'].apply(lambda x: 'M' if x == 'male' else 'F')

也可以写一个 function

def age_group(age):
    if age <= 20:
        return '20岁以下'
    elif age>=21 and age <=40 :
        return '21岁-40岁'
    elif age>=41 and age <=60 :
        return '41岁-60岁'
    elif age>=61 and age <=80 :
        return '61岁-80岁'
    elif age>=81 and age <=100 :
        return '81岁-100岁'
    elif age >=101:
        return '101岁以上'
    else:
        return 'error'

df['Age_Group'] = df.apply(lambda x: age_group(x['Age']), axis=1)

回圈操作,但基本上会比 apply 慢

for index, row in df.iterrows():
    if row['Sex'] == 'male':
        df.loc[index, 'Sex'] = 'M'
    else:
        df.loc[index, 'Sex'] = 'F'

排序

ascending 默认值为 False,会采取升幂方式排序

df.sort_values(by=['Age'], ascending=False)

资料筛选

df[] 里面可以放条件,让 dataframe 去找寻合适的条件,另外後面可以选择栏位(需要两个中括号)

df[df['Age'] > 30][['Age', 'Survived']] 

用 and

df[(df['Age'] > 30) & (df['Embarked']=='S')] 

用 or

df[(df['Age'] > 30) | (df['Embarked']=='S')] 

也可以用 isin 筛选

df[df['Embarked'].isin(['S', 'C'])] 

<<:  Day17 - 进入轻前端 Vue 前的范例

>>:  [Day 9] SRE - 自动化

Day5. 在没有运转前,世界就是静止的 - Runner

昨天谈了Render,那今天要开始针对我们的需求实作了吗? 我只能说,没错我们快要来谈需求实作了,但...

Day10 X 实作一个简单的 Virtualized List 吧!

Facebook、Instagram 应该都是我们日常生活中非常依赖的社群媒体了,每天闲来无事就要...

予焦啦!Hello World 与 Uart 机制观察

本节是以 Golang 上游 7ee4c1665477c6cf574cb9128deaf9d009...

[Day26] 求值策略

Call by Value 传值 Call by Reterence 传参照 Call by Sh...

Angular 深入浅出三十天:表单与测试 Day19 - 与 Cypress 的初次见面(下)

昨天跟大家初步地分享了 Cypress 怎麽安装、 Cypress 的资料夹结构 、 Cypres...