Pandas系列教程(9)Pandas字符串处理


Pandas字符串处理

前面我们已经使用了字符串处理函数:

  df['bWendu'].try.replace('℃', '').astype('int32')

Pandas的字符串处理:

1、使用方法:先获取Series的str属性,然后在属性上调用函数;

2、只能在字符串列上使用,不能在数字列上使用;

3、DataFrame上没有str属性和处理方法;

4、Series.str并不是Python原生字符串,而是自己的一套方法,不过大部分和原生str很相似

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

  https://pandas.pydata.org/pandas-docs/stable/reference/series.html#string-handing

本节演示内容:

1、获取Series的str属性,然后使用各种字符串处理函数

2、使用str的startswith,contains等bool类Series可以做条件查询

3、需要多次str处理的链式操作

4、使用正则表达式处理

 

1、读取北京2018年天气数据

import pandas as pd

file_path = "../../datas/files/beijing_tianqi_2018.csv"
df = pd.read_csv(file_path)
print(df.head())
print(df.dtypes)

2、获取Series的str属性,使用各种字符串处理函数

import pandas as pd

file_path = "../../datas/files/beijing_tianqi_2018.csv"
df = pd.read_csv(file_path)
print('*' * 25, '打印前几行数据', '*' * 25)
print(df.head())
print('*' * 25, '打印每列数据类型', '*' * 25)
print(df.dtypes)

print('*' * 25, '获取Series的str属性', '*' * 25)
print(df['bWendu'].str)

print('*' * 25, '字符串替换函数', '*' * 25)
df['bWendu'].str.replace('', '')

print('*' * 25, '判断是不是数字', '*' * 25)
print(df['bWendu'].str.isnumeric())

print('*' * 25, '判断是不是数字', '*' * 25)
print(df['aqi'].str.len())

3、使用str的startswith,contains等得到bool的Series可以做条件查询

import pandas as pd

file_path = "../../datas/files/beijing_tianqi_2018.csv"
df = pd.read_csv(file_path)

print('*' * 25, '打印前几行数据', '*' * 25)
print(df.head())
print('*' * 25, '打印每列数据类型', '*' * 25)
print(df.dtypes)

condition = df['ymd'].str.startswith('2018-03')
print(condition)
print(df[condition].head())

4、需要多次str处理的链式操作

怎样提取201803这样的数字月份?

1、先将日期2018-03-31替换成20180331的形式

2、提取月份字符串201803

import pandas as pd

file_path = "../../datas/files/beijing_tianqi_2018.csv"
df = pd.read_csv(file_path)

print('*' * 25, '打印前几行数据', '*' * 25)
print(df.head())
print('*' * 25, '打印每列数据类型', '*' * 25)
print(df.dtypes)

# 先将日期2018-03-31替换成20180331的形式
print('*' * 50)
print(df['ymd'].str.replace('-', ''))

# 每次调用函数,都返回一个新的Series
# df['ymd'].str.replace('-', '').slice(0, 6)    # 错误写法
print('*' * 50)
print(df['ymd'].str.replace('-', '').str.slice(0, 6))

# slice就是切片语法,可以直接使用
print('*' * 50)
print(df['ymd'].str.replace('-', '').str[0:6])

5、使用正则表达式处理

import pandas as pd

file_path = "../../datas/files/beijing_tianqi_2018.csv"
df = pd.read_csv(file_path)

print('*' * 25, '打印前几行数据', '*' * 25)
print(df.head())
print('*' * 25, '打印每列数据类型', '*' * 25)
print(df.dtypes)


# 添加新列
print('*' * 25, '添加新列', '*' * 25)
def get_nianyyueri(x):
    year, month, day = x['ymd'].split('-')
    return f'{year}年{month}月{day}日'

df['中文日期'] = df.apply(get_nianyyueri, axis=1)
print(df['中文日期'])

# 问题:怎样将"2018年12月31日"中的年、月、日三个中文字符去掉
# 方法1:链式replace
# print(df['中文日期'].str.replace('年', '').str.replace('月', '').str.replace('日', ''))

# 方法2:正则表达式替换(推荐使用)
# Series.str默认就开启了正则表达式模式
print('*' * 25, '正则表达式替换', '*' * 25)
print(df['中文日期'].str.replace('[年月日]', ''))