excel 是很多人常用来处理报表与数据的工具,同样地在 python 也有一个套件常常在处理这件事,就是我们今天的主角 Pandas。这个工具是很多人在做 python 资料分析的探索工具,有必要好好地学习熊猫!
pandas 为第三方套件库,记得先安装後,通常还会安装相依的套件库 numpy
pip install numpy
pip install pandas
numpy 和 pandas 均需要导入;大部分人习惯缩写用 np 和 pd
import numpy as np
import pandas as pd
类似 list 的资料结构,可以自订索引,是一个有索引值的一维阵列
s1 = pd.Series([0, 1, 2])
s1
s2 = pd.Series([0, 1, 2], index=[2, 7, 9])
s2
有属性 values 和 index,可以使用
类似 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 是表示显示全部,也可以更改为正整数
详细请参考
pd.set_option('display.max_columns', None)
pd.set_option("max_colwidth", None)
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'])]
昨天谈了Render,那今天要开始针对我们的需求实作了吗? 我只能说,没错我们快要来谈需求实作了,但...
Facebook、Instagram 应该都是我们日常生活中非常依赖的社群媒体了,每天闲来无事就要...
本节是以 Golang 上游 7ee4c1665477c6cf574cb9128deaf9d009...
Call by Value 传值 Call by Reterence 传参照 Call by Sh...
昨天跟大家初步地分享了 Cypress 怎麽安装、 Cypress 的资料夹结构 、 Cypres...