在处理数据的时候,很多时候会遇到批量替换的情况,如果一个一个去修改效率过低,也容易出错。
replace()是很好的方法。
日期 | 高温 | 低温 | 风向 | 强度 |
---|---|---|---|---|
2019-01-01 | -7℃ | -17℃ | 西南风 | 1级 |
2019-01-02 | -3℃ | -16℃ | 东南风 | 1级 |
2019-01-03 | 2℃ | -10℃ | 西南风 | 1级 |
2019-01-04 | -2℃ | -15℃ | 西南风 | 1级 |
2019-01-05 | -5℃ | -15℃ | 东北风 | 1级 |
2019-01-06 | -5℃ | -16℃ | 西南风 | 1级 |
2019-01-07 | -2℃ | -16℃ | 西南风 | 1级 |
2019-01-08 | -5℃ | -15℃ | 东北风 | 2级 |
2019-01-09 | 0℃ | -7℃ | 东南风 | 2级 |
2019-01-10 | 4℃ | -10℃ | 东南风 | 1级 |
一、导入数据
import pandas as pd # 引入pandas
df = pd.read_excel("tianqi.xlsx") # 导入文件
df.set_index("日期", inplace = True) # 日期列设置为index
print(df)
日期 高温 低温 风向 强度
2019-01-01 -7℃ -17℃ 西南风 1级
2019-01-02 -3℃ -16℃ 东南风 1级
2019-01-03 2℃ -10℃ 西南风 1级
2019-01-04 -2℃ -15℃ 西南风 1级
2019-01-05 -5℃ -15℃ 东北风 1级
2019-01-06 -5℃ -16℃ 西南风 1级
2019-01-07 -2℃ -16℃ 西南风 1级
2019-01-08 -5℃ -15℃ 东北风 2级
2019-01-09 0℃ -7℃ 东南风 2级
2019-01-10 4℃ -10℃ 东南风 1级
二、替换全部
replace的基本结构是:df.replace(to_replace, value) 前面是需要替换的值,后面是替换后的值。
df.replace("-7℃","【一朵】")
这样Python就会搜索整个DataFrame并将文档中所有的“-7℃”替换成“【一朵】”。要注意这样的操作并没有改变文档的源数据,要改变源数据需要使用inplace = True
df.replace("-7℃","【一朵】",inplace = True)
日期 高温 低温 风向 强度
2019-01-01 【一朵】 -17℃ 西南风 1级
2019-01-02 -3℃ -16℃ 东南风 1级
2019-01-03 2℃ -10℃ 西南风 1级
2019-01-04 -2℃ -15℃ 西南风 1级
2019-01-05 -5℃ -15℃ 东北风 1级
2019-01-06 -5℃ -16℃ 西南风 1级
2019-01-07 -2℃ -16℃ 西南风 1级
2019-01-08 -5℃ -15℃ 东北风 2级
2019-01-09 0℃ 【一朵】 东南风 2级
2019-01-10 4℃ -10℃ 东南风 1级
三、替换某列里的内容,而不改变其它列
仅将[“高温”]列的“-7℃”替换成“【一朵】”
df["高温"].replace("-7℃","【一朵】",inplace = True)
日期 高温 低温 风向 强度
2019-01-01 【一朵】 -17℃ 西南风 1级
2019-01-02 -3℃ -16℃ 东南风 1级
2019-01-03 2℃ -10℃ 西南风 1级
2019-01-04 -2℃ -15℃ 西南风 1级
2019-01-05 -5℃ -15℃ 东北风 1级
2019-01-06 -5℃ -16℃ 西南风 1级
2019-01-07 -2℃ -16℃ 西南风 1级
2019-01-08 -5℃ -15℃ 东北风 2级
2019-01-09 0℃ -7℃ 东南风 2级
2019-01-10 4℃ -10℃ 东南风 1级
四、替换某列数据的部分内容
将[“高温”]列的“℃”替换成“",达到删除效果。
.astype(“int32”)转换为数字。
df["高温"] = df["高温"].str.replace("℃","").astype("int32")
日期 高温 低温 风向 强度
2019-01-01 -7 -17℃ 西南风 1级
2019-01-02 -3 -16℃ 东南风 1级
2019-01-03 2 -10℃ 西南风 1级
2019-01-04 -2 -15℃ 西南风 1级
2019-01-05 -5 -15℃ 东北风 1级
2019-01-06 -5 -16℃ 西南风 1级
2019-01-07 -2 -16℃ 西南风 1级
2019-01-08 -5 -15℃ 东北风 2级
2019-01-09 0 -7℃ 东南风 2级
2019-01-10 4 -10℃ 东南风 1级
查看数据类型
print(df.dtypes)
高温 int32
低温 object
风向 object
强度 object
dtype: object
注意:
使用str.replace时不能使用inplace = True参数,因此需要改成赋值。赋值的时候不要忘了是列的赋值而不是整个表格的赋值。请体会下面的区别。
df = df["高温"].str.replace("℃","").astype("int32")
日期
2019-01-01 -7
2019-01-02 -3
2019-01-03 2
2019-01-04 -2
2019-01-05 -5
2019-01-06 -5
2019-01-07 -2
2019-01-08 -5
2019-01-09 0
2019-01-10 4
Name: 高温, dtype: int32
五、替换某行内容
将[“2019-01-01”]行的“西南风"替换成“【一朵】"。
df.loc["2019-01-01"].replace("西南风","【一朵】", inplace = True)
日期 高温 低温 风向 强度
2019-01-01 -7℃ -17℃ 【一朵】 1级
2019-01-02 -3℃ -16℃ 东南风 1级
2019-01-03 2℃ -10℃ 西南风 1级
2019-01-04 -2℃ -15℃ 西南风 1级
2019-01-05 -5℃ -15℃ 东北风 1级
2019-01-06 -5℃ -16℃ 西南风 1级
2019-01-07 -2℃ -16℃ 西南风 1级
2019-01-08 -5℃ -15℃ 东北风 2级
2019-01-09 0℃ -7℃ 东南风 2级
2019-01-10 4℃ -10℃ 东南风 1级
将"2019-01-01"到"2019-01-03"里面的"西南风"替换为"【一朵】"
df.loc["2019-01-01":"2019-01-03"].replace("西南风","【一朵】", inplace = True)
日期 高温 低温 风向 强度
2019-01-01 -7℃ -17℃ 【一朵】 1级
2019-01-02 -3℃ -16℃ 东南风 1级
2019-01-03 2℃ -10℃ 【一朵】 1级
2019-01-04 -2℃ -15℃ 西南风 1级
2019-01-05 -5℃ -15℃ 东北风 1级
2019-01-06 -5℃ -16℃ 西南风 1级
2019-01-07 -2℃ -16℃ 西南风 1级
2019-01-08 -5℃ -15℃ 东北风 2级
2019-01-09 0℃ -7℃ 东南风 2级
2019-01-10 4℃ -10℃ 东南风 1级
D:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py:4172: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
method=method,
可以正常显示结果,但是有很多提示,我看不懂。大概是不建议这么使用。
六、替换指定的某一个或多个值(用字典、列表的形式)
用字典替换多个数值,比较容易理解,字典里的键作为原值,字典里的值作为替换的新值。
df.replace({"西南风":"【一】","东南风":"【朵】"}, inplace = True)
日期 高温 低温 风向 强度
2019-01-01 -7℃ -17℃ 【一】 1级
2019-01-02 -3℃ -16℃ 【朵】 1级
2019-01-03 2℃ -10℃ 【一】 1级
2019-01-04 -2℃ -15℃ 【一】 1级
2019-01-05 -5℃ -15℃ 东北风 1级
2019-01-06 -5℃ -16℃ 【一】 1级
2019-01-07 -2℃ -16℃ 【一】 1级
2019-01-08 -5℃ -15℃ 东北风 2级
2019-01-09 0℃ -7℃ 【朵】 2级
2019-01-10 4℃ -10℃ 【朵】 1级
用列表的形式替换多个数值,前面列表保存原值,后面列表保存新值。
df.replace(["西南风","东南风"],["【一】","【朵】"], inplace = True)
日期 高温 低温 风向 强度
2019-01-01 -7℃ -17℃ 【一】 1级
2019-01-02 -3℃ -16℃ 【朵】 1级
2019-01-03 2℃ -10℃ 【一】 1级
2019-01-04 -2℃ -15℃ 【一】 1级
2019-01-05 -5℃ -15℃ 东北风 1级
2019-01-06 -5℃ -16℃ 【一】 1级
2019-01-07 -2℃ -16℃ 【一】 1级
2019-01-08 -5℃ -15℃ 东北风 2级
2019-01-09 0℃ -7℃ 【朵】 2级
2019-01-10 4℃ -10℃ 【朵】 1级
替换的新值是相同的,还可以这样使用:
df.replace(["西南风","东南风"],"【一朵】", inplace = True)
日期 高温 低温 风向 强度
2019-01-01 -7℃ -17℃ 【一朵】 1级
2019-01-02 -3℃ -16℃ 【一朵】 1级
2019-01-03 2℃ -10℃ 【一朵】 1级
2019-01-04 -2℃ -15℃ 【一朵】 1级
2019-01-05 -5℃ -15℃ 东北风 1级
2019-01-06 -5℃ -16℃ 【一朵】 1级
2019-01-07 -2℃ -16℃ 【一朵】 1级
2019-01-08 -5℃ -15℃ 东北风 2级
2019-01-09 0℃ -7℃ 【一朵】 2级
2019-01-10 4℃ -10℃ 【一朵】 1级
七、使用正则表达式替换
正则表达式可以实现一次替换很多个有规律的不同值
先将“西南风”、“东南风”替换为英文字母,用于演示
df["风向"].replace(["西南风","东南风"],["A","C"], inplace = True)
日期 高温 低温 风向 强度
2019-01-01 -7℃ -17℃ A 1级
2019-01-02 -3℃ -16℃ C 1级
2019-01-03 2℃ -10℃ A 1级
2019-01-04 -2℃ -15℃ A 1级
2019-01-05 -5℃ -15℃ 东北风 1级
2019-01-06 -5℃ -16℃ A 1级
2019-01-07 -2℃ -16℃ A 1级
2019-01-08 -5℃ -15℃ 东北风 2级
2019-01-09 0℃ -7℃ C 2级
2019-01-10 4℃ -10℃ C 1级
然后将英文字母替换为“【一朵】”,使用正则表达式的时候记得后面加 regex=True参数
df["风向"].replace("[A-Z]","【一朵】", regex = True, inplace = True)
日期 高温 低温 风向 强度
2019-01-01 -7℃ -17℃ 【一朵】 1级
2019-01-02 -3℃ -16℃ 【一朵】 1级
2019-01-03 2℃ -10℃ 【一朵】 1级
2019-01-04 -2℃ -15℃ 【一朵】 1级
2019-01-05 -5℃ -15℃ 东北风 1级
2019-01-06 -5℃ -16℃ 【一朵】 1级
2019-01-07 -2℃ -16℃ 【一朵】 1级
2019-01-08 -5℃ -15℃ 东北风 2级
2019-01-09 0℃ -7℃ 【一朵】 2级
2019-01-10 4℃ -10℃ 【一朵】 1级
八、使用条件替换
判断[“高温”] 列的字符串为 “-5℃"时,将本行的 [“风向”]列,替换为”【一朵】"
df.loc[df["高温"] == "-5℃", "风向"] = "【一朵】"
日期 高温 低温 风向 强度
2019-01-01 -7℃ -17℃ 西南风 1级
2019-01-02 -3℃ -16℃ 东南风 1级
2019-01-03 2℃ -10℃ 西南风 1级
2019-01-04 -2℃ -15℃ 西南风 1级
2019-01-05 -5℃ -15℃ 【一朵】 1级
2019-01-06 -5℃ -16℃ 【一朵】 1级
2019-01-07 -2℃ -16℃ 西南风 1级
2019-01-08 -5℃ -15℃ 【一朵】 2级
2019-01-09 0℃ -7℃ 东南风 2级
2019-01-10 4℃ -10℃ 东南风 1级
也可以用数字做判断条件
先将[“高温”]列转换为数字
df["高温"] = df["高温"].str.replace("℃","").astype("int32")
日期 高温 低温 风向 强度
2019-01-01 -7 -17℃ 西南风 1级
2019-01-02 -3 -16℃ 东南风 1级
2019-01-03 2 -10℃ 西南风 1级
2019-01-04 -2 -15℃ 西南风 1级
2019-01-05 -5 -15℃ 东北风 1级
2019-01-06 -5 -16℃ 西南风 1级
2019-01-07 -2 -16℃ 西南风 1级
2019-01-08 -5 -15℃ 东北风 2级
2019-01-09 0 -7℃ 东南风 2级
2019-01-10 4 -10℃ 东南风 1级
判断[“高温”]列数值 >=0 时,将本行的 [“风向”]列,替换为 “【一朵】”
df.loc[df["高温"] >= 0, "风向"] = "【一朵】"
日期 高温 低温 风向 强度
2019-01-01 -7 -17℃ 西南风 1级
2019-01-02 -3 -16℃ 东南风 1级
2019-01-03 2 -10℃ 【一朵】 1级
2019-01-04 -2 -15℃ 西南风 1级
2019-01-05 -5 -15℃ 东北风 1级
2019-01-06 -5 -16℃ 西南风 1级
2019-01-07 -2 -16℃ 西南风 1级
2019-01-08 -5 -15℃ 东北风 2级
2019-01-09 0 -7℃ 【一朵】 2级
2019-01-10 4 -10℃ 【一朵】 1级
多条件替换也可以
判断[“高温”]列数值 >=0 并且 [“强度”]列字符串为"2级"时,将本行的 [“风向”]列,替换为 “【一朵】”。注意&前后的筛选条件用()括起来
df.loc[(df["高温"] >= 0) & (df["强度"] == "2级"), "风向"] = "【一朵】"
日期 高温 低温 风向 强度
2019-01-01 -7 -17℃ 西南风 1级
2019-01-02 -3 -16℃ 东南风 1级
2019-01-03 2 -10℃ 西南风 1级
2019-01-04 -2 -15℃ 西南风 1级
2019-01-05 -5 -15℃ 东北风 1级
2019-01-06 -5 -16℃ 西南风 1级
2019-01-07 -2 -16℃ 西南风 1级
2019-01-08 -5 -15℃ 东北风 2级
2019-01-09 0 -7℃ 【一朵】 2级
2019-01-10 4 -10℃ 东南风 1级
九、使用函数替换
lambda函数也适合用来筛选并替换,达到和上面条件筛选一样的效果
df.loc[lambda df : (df["高温"] >= 0) & (df["强度"] == "1级"), "风向"] = "【一朵】"
日期 高温 低温 风向 强度
2019-01-01 -7 -17℃ 西南风 1级
2019-01-02 -3 -16℃ 东南风 1级
2019-01-03 2 -10℃ 【一朵】 1级
2019-01-04 -2 -15℃ 西南风 1级
2019-01-05 -5 -15℃ 东北风 1级
2019-01-06 -5 -16℃ 西南风 1级
2019-01-07 -2 -16℃ 西南风 1级
2019-01-08 -5 -15℃ 东北风 2级
2019-01-09 0 -7℃ 东南风 2级
2019-01-10 4 -10℃ 【一朵】 1级
自定义函数的筛选并替换,效果也是一样的。
……暂时还没有学会
replace()
既可以替换某列,也可以替换某行,还可以全表替换
df.replace() 或者 df[col]replace()
参数如下:
df.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method=‘pad’,)
参数说明:
to_replace:被替换的值
value:替换后的值
inplace:是否要改变原数据,False是不改变,True是改变,默认是False
limit:控制填充次数
regex:是否使用正则,False是不使用,True是使用,默认是False
method:填充方式,pad,ffill,bfill分别是向前、向前、向后填充