Pandas | 如何新增数据列?
2023-02-18 16:35:08 时间
前言
在数据分析时,原始数据往往不能满足我们的需求,经常需要按照一定条件创建新的数据列或者修改原有数据列,然后进行后续分析。
本次我们将介绍四种新增数据列的方法:直接赋值、df.apply方法、df.assign方法以及按条件筛选后赋值。
本文框架
- 0. 导入Pandas
- 1. 读取数据与数据预处理
- 2. 直接赋值
- 3. df.apply方法
- 4. df.assign方法
- 5. 按条件筛选后赋值
0. 导入Pandas
import pandas as pd
1. 读取数据与数据预处理
# 读取数据
data = pd.read_csv("./datas/04/Weather_2018.csv")
--------------------------------------------------------------------------------
# 查看数据前6行
data.head(6)
# 返回结果
ymd bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
0 2018-01-01 3℃ -6℃ 晴~多云 东北风 1-2级 59 良 2
1 2018-01-02 2℃ -5℃ 阴~多云 东北风 1-2级 49 优 1
2 2018-01-03 2℃ -5℃ 多云 北风 1-2级 28 优 1
3 2018-01-04 0℃ -8℃ 阴 东北风 1-2级 28 优 1
4 2018-01-05 3℃ -6℃ 多云~晴 西北风 1-2级 50 优 1
5 2018-01-06 2℃ -5℃ 多云~阴 西南风 1-2级 32 优 1
--------------------------------------------------------------------------------
# 替换掉温度的后缀℃
# 先将数据转化成字符串,再将"℃"替换为空,最后再转化为数值
data["bWendu"] = data["bWendu"].str.replace("℃", "").astype("int32")
data["yWendu"] = data["yWendu"].str.replace("℃", "").astype("int32")
--------------------------------------------------------------------------------
# 查看转化后数据框
data.head()
# 返回结果
bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
ymd
2018-01-01 3 -6 晴~多云 东北风 1-2级 59 良 2
2018-01-02 2 -5 阴~多云 东北风 1-2级 49 优 1
2018-01-03 2 -5 多云 北风 1-2级 28 优 1
2018-01-04 0 -8 阴 东北风 1-2级 28 优 1
2018-01-05 3 -6 多云~晴 西北风 1-2级 50 优 1
2. 直接赋值
我们可以通过"df["新列名"] = ……"方式添加新列。
# 计算温差
data["Temperature_difference"] = data["bWendu"] - data["yWendu"]
# 查看添加新列后的数据
data.head()
# 返回结果
ymd bWendu yWendu ... aqiInfo aqiLevel Temperature_difference
0 2018-01-01 3 -6 ... 良 2 9
1 2018-01-02 2 -5 ... 优 1 7
2 2018-01-03 2 -5 ... 优 1 7
3 2018-01-04 0 -8 ... 优 1 8
4 2018-01-05 3 -6 ... 优 1 9
3. df.apply方法
使用apply时,通常放入一个 lambda 函数表达式、或一个函数作为操作运算。
在此我们为数据添加"Temperature_type"列,设置最高温度大于30为热,最低气温低于-10为冷,其余为正常。
# 定义函数
def Temperature_type(df):
if df["bWendu"] > 30:
return "Hot"
elif df["yWendu"] < -10:
return "cold"
else:
return "normal"
# apply添加"Temperature_type"列
# axis=1,表示横向操作,增加新的列;axis=0表示竖向操作,是增加新的行
data["Temperature_type"] = data.apply(Temperature_type,axis=1)
--------------------------------------------------------------------------------
# 查看结构
# df.value_counts()计算数据出现的频率
data["Temperature_type"].value_counts()
# 返回结果
normal 286
Hot 71
cold 8
Name: Temperature_type, dtype: int64
4. df.assign方法
①assign赋值新列时,一般用"新列名=表达式"的形式,其中新列名为变量的形式,所以不加引号(加引号时意味着是字符串);
②assign返回创建了新列的dataframe,不会修改原本的dataframe,所以一般需要用新的dataframe对象接收返回值;
③assign不仅可用于创建新的列,也可用于更新已有列,此时创建的新列会覆盖原有列。
这这里,我们将最低气温和最低气温转化为华氏度。
# 添加华氏度列
data.assign( b_Fahrenheit = lambda df : df["bWendu"] * 9 / 5 + 32,
y_Fahrenheit = lambda df : df["yWendu"] * 9 / 5 + 32)
# 返回结果
ymd bWendu yWendu ... Temperature_type b_Fahrenheit y_Fahrenheit
0 2018-01-01 3 -6 ... normal 37.4 21.2
1 2018-01-02 2 -5 ... normal 35.6 23.0
2 2018-01-03 2 -5 ... normal 35.6 23.0
3 2018-01-04 0 -8 ... normal 32.0 17.6
4 2018-01-05 3 -6 ... normal 37.4 21.2
.. ... ... ... ...
5. 按条件筛选后赋值
# 创建"Temperature_difference"空列
data["Temperature_difference"] = ''
# 为"Temperature_difference"赋值
data.loc[data["bWendu"]-data["yWendu"]>10,"Temperature_difference"] = "温差大"
data.loc[data["bWendu"]-data["yWendu"]<=10,"Temperature_difference"] = "温差小"
--------------------------------------------------------------------------------
# 查看温差大小频数
data["Temperature_difference"].value_counts()
# 返回结果
温差小 187
温差大 178
Name: Temperature_difference, dtype: int64
相关文章
- 15个问题自查你真的了解java编译优化吗?
- 实现服务器和客户端数据交互,Java Socket有妙招
- 世界杯专题看板丨今晚8点开战,数据先睹为快!
- Crack App | 某合伙人登录参数 apisign 逻辑分析
- Crack App | 某都市魔幻 FM 请求参数 sign 的加密分析
- Crack App | 某赢+ 二手车 App 登录参数加密逻辑分析
- RocketMQ: 技术架构与启动流程
- 目前社区关于ServiceMesh的主要方向
- k8s的架构是怎么变成现在这个样子
- Envoy的lib库拓扑关系
- 转发“Istio共享代理新模式Ambient Mesh”
- 如何设计属于你自己的秒杀系统?
- 如何把Java代码玩出花?JVM Sandbox入门教程与原理浅谈
- 删错了文件怎么办,文件快速恢复
- ChatGPT 浏览器插件实现思路解析
- 存储系统中的算法:LSM 树设计原理
- 说透游戏中常用的两种随机算法
- 我用消息队列做了一款联机小游戏
- 用算法打败算法
- CRUD 一年多,我的破局思路