Pandas字符串处理
Series.str字符串方法列表参考文档
文章目录
- Pandas字符串处理
- 读取数据
- 获取Series的str属性,使用各种字符串处理函数
- 使用str的startswith、contains等得到bool的Series可以做条件查询
- 需要多次str处理的链式操作
- 使用正则表达式的处理
Pandas的字符串处理:
- 使用方法:先获取Series的str属性,然后在属性上调用函数;
- 只能在字符串列上使用,不能数字列上使用;
- Dataframe上没有str属性和处理方法
- Series.str并不是Python原生字符串,而是自己的一套方法,不过大部分和原生str很相似;
本节演示内容:
- 获取Series的str属性,然后使用各种字符串处理函数
- 使用str的startswith、contains等bool类Series可以做条件查询
- 需要多次str处理的链式操作
- 使用正则表达式的处理
读取数据
代码语言:javascript复制import pandas as pd
代码语言:javascript复制df = pd.read_csv("data.xlsx")
df.head()
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 |
df.dtypes
代码语言:javascript复制ymd object
bWendu object
yWendu object
tianqi object
fengxiang object
fengli object
aqi int64
aqiInfo object
aqiLevel int64
dtype: object
获取Series的str属性,使用各种字符串处理函数
代码语言:javascript复制df["bWendu"].str
代码语言:javascript复制<pandas.core.strings.StringMethods at 0x1af21871808>
代码语言:javascript复制# 字符串替换函数
df["bWendu"].str.replace("℃", "")
代码语言:javascript复制0 3
1 2
2 2
3 0
4 3
..
360 -5
361 -3
362 -3
363 -2
364 -2
Name: bWendu, Length: 365, dtype: object
代码语言:javascript复制# 判断是不是数字
df["bWendu"].str.isnumeric()
代码语言:javascript复制0 False
1 False
2 False
3 False
4 False
...
360 False
361 False
362 False
363 False
364 False
Name: bWendu, Length: 365, dtype: bool
代码语言:javascript复制df["aqi"].str.len()
使用str的startswith、contains等得到bool的Series可以做条件查询
代码语言:javascript复制condition = df["ymd"].str.startswith("2018-03")
代码语言:javascript复制condition
代码语言:javascript复制0 False
1 False
2 False
3 False
4 False
...
360 False
361 False
362 False
363 False
364 False
Name: ymd, Length: 365, dtype: bool
代码语言:javascript复制df[condition].head()
ymd | bWendu | yWendu | tianqi | fengxiang | fengli | aqi | aqiInfo | aqiLevel | |
---|---|---|---|---|---|---|---|---|---|
59 | 2018-03-01 | 8℃ | -3℃ | 多云 | 西南风 | 1-2级 | 46 | 优 | 1 |
60 | 2018-03-02 | 9℃ | -1℃ | 晴~多云 | 北风 | 1-2级 | 95 | 良 | 2 |
61 | 2018-03-03 | 13℃ | 3℃ | 多云~阴 | 北风 | 1-2级 | 214 | 重度污染 | 5 |
62 | 2018-03-04 | 7℃ | -2℃ | 阴~多云 | 东南风 | 1-2级 | 144 | 轻度污染 | 3 |
63 | 2018-03-05 | 8℃ | -3℃ | 晴 | 南风 | 1-2级 | 94 | 良 | 2 |
需要多次str处理的链式操作
怎样提取201803这样的数字月份? 1、先将日期2018-03-31替换成20180331的形式 2、提取月份字符串201803
代码语言:javascript复制df["ymd"].str.replace("-", "")
代码语言:javascript复制0 20180101
1 20180102
2 20180103
3 20180104
4 20180105
...
360 20181227
361 20181228
362 20181229
363 20181230
364 20181231
Name: ymd, Length: 365, dtype: object
代码语言:javascript复制# 每次调用函数,都返回一个新Series
df["ymd"].str.replace("-", "").slice(0, 6)
使用正则表达式的处理
代码语言:javascript复制# 添加新列
def get_nianyueri(x):
year,month,day = x["ymd"].split("-")
return f"{year}年{month}月{day}日"
df["中文日期"] = df.apply(get_nianyueri, axis=1)
代码语言:javascript复制df["中文日期"]
代码语言:javascript复制0 2018年01月01日
1 2018年01月02日
2 2018年01月03日
3 2018年01月04日
4 2018年01月05日
...
360 2018年12月27日
361 2018年12月28日
362 2018年12月29日
363 2018年12月30日
364 2018年12月31日
Name: 中文日期, Length: 365, dtype: object
问题:怎样将“2018年12月31日”中的年、月、日三个中文字符去除?
代码语言:javascript复制# 方法1:链式replace
df["中文日期"].str.replace("年", "").str.replace("月","").str.replace("日", "")
代码语言:javascript复制0 20180101
1 20180102
2 20180103
3 20180104
4 20180105
...
360 20181227
361 20181228
362 20181229
363 20181230
364 20181231
Name: 中文日期, Length: 365, dtype: object
Series.str默认就开启了正则表达式模式
代码语言:javascript复制# 方法2:正则表达式替换
df["中文日期"].str.replace("[年月日]", "")
代码语言:javascript复制0 20180101
1 20180102
2 20180103
3 20180104
4 20180105
...
360 20181227
361 20181228
362 20181229
363 20181230
364 20181231
Name: 中文日期, Length: 365, dtype: object