Pandas中字符串处理

2022-11-27 11:48:36 浏览数 (1)

Pandas字符串处理

Series.str字符串方法列表参考文档

文章目录

  • Pandas字符串处理
    • 读取数据
    • 获取Series的str属性,使用各种字符串处理函数
    • 使用str的startswith、contains等得到bool的Series可以做条件查询
    • 需要多次str处理的链式操作
    • 使用正则表达式的处理

Pandas的字符串处理:

  1. 使用方法:先获取Series的str属性,然后在属性上调用函数;
  2. 只能在字符串列上使用,不能数字列上使用;
  3. Dataframe上没有str属性和处理方法
  4. Series.str并不是Python原生字符串,而是自己的一套方法,不过大部分和原生str很相似;

本节演示内容:

  1. 获取Series的str属性,然后使用各种字符串处理函数
  2. 使用str的startswith、contains等bool类Series可以做条件查询
  3. 需要多次str处理的链式操作
  4. 使用正则表达式的处理

读取数据

代码语言: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

代码语言:javascript复制
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

0 人点赞