#CDA学习打卡 #CDA数据分析师
八、Pandas文本数据
数据准备
#数据准备
import pandas as pd
import numpy as np
data = pd.DataFrame(['a','b','c'],columns=['A'])
data
## 结果
# A
# 0 a
# 1 b
# 2 c
data2 = pd.DataFrame(['a-b-c','a-t-b','f-f',np.nan],columns=['A'])
data2['A'].str.repeat(2)
## 结果
# 0 a-b-ca-b-c
# 1 a-t-ba-t-b
# 2 f-ff-f
# 3 NaN
# Name: A, dtype: object
data3 = pd.DataFrame(['q.b ',' aa', ' d f g ',np.nan],columns=['B'])
data3
## 结果
# B
# 0 q.b
# 1 aa
# 2 d f g
# 3 NaN
data4 = pd.DataFrame(['a-b-c','a-t-b','f-f',np.nan,' ',123,'aa','AA','Ab'],columns=['A'])
data4
## 结果
# A
# 0 a-b-c
# 1 a-t-b
# 2 f-f
# 3 NaN
# 4
# 5 123
# 6 aa
# 7 AA
# 8 Ab
cat()拼接字符串
①data[‘A’].str.cat([‘A’,‘B’,‘C’],sep=‘,’)
②data[‘A’].str.cat(sep=‘,’)
split()切分字符串
dA’].str.split(‘-’)
get()获取指定位置字符串
data2[‘A’].str.get(2)
join()使用给定字符将字符串拼接
data2[‘A’].str.join(‘~’)
contains()是否包含表达式
①data2[‘A’].str.contains(‘c’)
②data2.fillna(‘0’)[data2.fillna(‘0’)[‘A’].str.contains(‘t’)]
③data2.fillna(‘0’)[data2[‘A’].fillna(‘0’).str.contains(‘t|f’)]
replace()替换
data2[‘A’].str.replace(‘-’,‘&’)
repeat()重复
data2[‘A’].str.repeat(2)
字符串对齐
pad() 左补齐
data2[‘A’].str.pad(10,fillchar=‘0’)
pad() 右补齐
data2[‘A’].str.pad(10,fillchar=‘0’,side=‘right’)
enter() 中间补齐
data2[‘A’].str.center(10,fillchar=‘?’)
ljust() 文本左对齐,补右边
data2[‘A’].str.ljust(10,fillchar=‘?’)
rjust() 文本右对齐,补左边
data2[‘A’].str.rjust(10,fillchar=‘?’)
zfill() 左边补0
data2[‘A’].str.zfill(10)
wrap()指定位置加回车符号
data2[‘A’].str.wrap(3)
slice()指定位置切割字符串
data2[‘A’].str.slice(1,3) #按索引取值,含左不含右
slice_replace()使用给定字符串,替换指定位置字符
data2[‘A’].str.slice_replace(1,3,“?”)
count()计算给定单词出现次数
data2[‘A’].str.count(“a”)
startswith()判断是否以给定字符开头
data2[‘A’].str.startswith(‘a’)
endswith()判断是否以给定字符结尾
data2[‘A’].str.startswith(‘f’)
findall()查找所有符合条件的字符,返回数组
data2[‘A’].str.findall(‘[a-z]’)
match()检测是否匹配给定条件
data2[‘A’].str.match(‘[f-z]’)
extract()提取给定条件的数据
data2[‘A’].str.extract(‘([f-z])’)
len()字符串长度
data2[‘A’].str.len()
去重空白字符串
strip()去除前后空白字符串
data3[‘B’].str.strip()
rstrip()去除后面空白字符串
data3[‘B’].str.rstrip()
lstrip()去除前面空白字符串
data3[‘B’].str.lstrip()
partition()字符串按照首个指定分割字符进行分割,成为数组
data2[‘A’].str.partition(‘-’)
rpartition()字符串按照最后一个指定分割字符进行分割,成为数组
data2[‘A’].str.rpartition(‘-’)
lower()全部小写
data2[‘A’].str.lower()
upper()全部大写
data2[‘A’].str.upper()
find()从左边开始查找,找不到返回-1
data2[‘A’].str.find(‘b’)
rfind()从右边开始查找,找不到返回-1
data2[‘A’].str.rfind(‘b’)
index()从左查找给定字符串位置,找不到报错(substring not found)
data2[‘A’].str.index(‘-’)
rindex()从右查找给定字符串位置,找不到报错
data2[‘A’].str.rindex(‘-’)
capitalize()首字符大写
data2[‘A’].str.capitalize()
swapcase()大小写互换
a = data2[‘A’].str.capitalize()
a.str.swapcase()
isalnum()是否都为数字或字母组成
data4[‘A’].str.isalnum()
isalpha()是否都为字母组成
data4[‘A’].str.isalpha()
isdigit()是否都为数字组成
data4[‘A’].str.isdigit()
isspace()是否空格
data4[‘A’].str.isspace()
islower()是否全部小写
data4[‘A’].str.islower()
isupper()是否全部大写
data4[‘A’].str.isupper()
istitle()是否首字母大写,其他小写
data4[‘A’].str.istitle()
isnumeric()是否都为数字
data4[‘A’].str.isnumeric()
isdecimal()是否都为数字
data4[‘A’].str.isdecimal()
九、Pandas时序数据
创建时间序列数据
# 创建时序
import pandas as pd
from datetime import datetime
# 使用to_datetime
date_range = pd.to_datetime(['2024-04-01','2024-04-02','2024-04-03'])
date_range
## 结果
# DatetimeIndex(['2024-04-01', '2024-04-02', '2024-04-03'], dtype='datetime64[ns]', freq=None)
# 使用pd.date_range
# 参数start-起始日期,end-结束日期,freq-间隔类型,
date_range2 = pd.date_range(start='2024-04-01',end='2024-12-01',freq='M')
date_range2
## 结果
# DatetimeIndex(['2024-04-30', '2024-05-31', '2024-06-30', '2024-07-31',
# '2024-08-31', '2024-09-30', '2024-10-31', '2024-11-30'],
# dtype='datetime64[ns]', freq='M')
# 使用datetime模块,创建时间戳
timestamp = pd.Timestamp(year=2024,month=4,day=1,hour=4,minute=15,second=16)
timestamp
## 结果
# Timestamp('2024-04-01 04:15:16')
# 使用datetime模块,创建时间戳2
timestamp2 = datetime(2024,4,1,4,15,16)
print(timestamp2)
## 结果
# 2024-04-01 04:15:16
时长数据计算
# 时间差
start_time = pd.Timestamp('2024-04-01 11:12:15')
end_time = pd.Timestamp('2024-04-03 15:13:15')
time_diff = end_time-start_time
time_diff
## 结果
# Timedelta('2 days 04:01:00')
# 时间加减
pd.Timestamp('2024-04-01 11:12:15')+pd.Timedelta('2 days 12:11:13')
## 结果
# Timestamp('2024-04-03 23:23:28')
时序索引
# 时序索引
# periods为时间序列长度,freq-间隔类型
data = [1,2,3,4,5]
s = pd.date_range('2024-4-1', periods=5, freq='D')
ts = pd.Series(data,index=s)
ts
## 结果
# 2024-04-01 1
# 2024-04-02 2
# 2024-04-03 3
# 2024-04-04 4
# 2024-04-05 5
# Freq: D, dtype: int64
#索引
ts['2024-4-1']
## 结果
# 1
#切片1
ts['2024-4-1':'2024-04-05']
## 结果
# 2024-04-01 1
# 2024-04-02 2
# 2024-04-03 3
# 2024-04-04 4
# 2024-04-05 5
# Freq: D, dtype: int64
#切片2
ts[2:4]
## 结果
# 2024-04-03 3
# 2024-04-04 4
# Freq: D, dtype: int64
# 时间序列重采样
# 'W'表示按周,'M'代表按月,mean()表示平均值
ts.resample('M').mean()
## 结果
# 2024-04-30 3.0
# Freq: M, dtype: float64
# 滚动计算,计算滚动平均值
# window代表窗口大小为3,即计算每3个数据平均值(包含本身往前的3个)
ts.rolling(window=3).mean()
## 结果
# 2024-04-01 NaN
# 2024-04-02 NaN
# 2024-04-03 2.0
# 2024-04-04 3.0
# 2024-04-05 4.0
# Freq: D, dtype: float64
# 时间偏移,将时间序列向前或向后移动
ts.shift(1) #向后
ts.shift(-1) #向前
## 结果(向后)
# 2024-04-01 NaN
# 2024-04-02 1.0
# 2024-04-03 2.0
# 2024-04-04 3.0
# 2024-04-05 4.0
# Freq: D, dtype: float64
## 结果(向前)
# 2024-04-01 2.0
# 2024-04-02 3.0
# 2024-04-03 4.0
# 2024-04-04 5.0
# 2024-04-05 NaN
# Freq: D, dtype: float64
时间访问器dt
查看数据年、月、日、时、分、秒、季度、星期等。
# 时间访问器
tst= pd.Series(pd.date_range('2024-10-1',periods=5,freq='M'))
tst
## 结果
# 0 2024-10-31
# 1 2024-11-30
# 2 2024-12-31
# 3 2025-01-31
# 4 2025-02-28
# dtype: datetime64[ns]
# 提取年份
year = tst.dt.year
year
# 提取月份
month = tst.dt.month
month
# 提取日期
day = tst.dt.day
day
# 提取小时
hour = tst.dt.hour
hour
# 提取分钟
minute = tst.dt.minute
minute
# 提取秒
second = tst.dt.second
second
# 提取季度
quarter = tst.dt.quarter
quarter
# 提取周
week = tst.dt.isocalendar().week
week
# 提取周几
day_name = tst.dt.day_name()
day_name
# 提取一年中的第几天
day_of_year = tst.dt.day_of_year
day_of_year
# 提取一周中的第几天(1为周一7为周日)
day_of_week = tst.dt.dayofweek+1
day_of_week
# 提取一月中的第几天
day_of_month = tst.dt.day
day_of_month
# 提取一月中的最后一天
end_of_month = tst.dt.daysinmonth
end_of_month
时长转化
# 时长转化
import pandas as pd
import numpy as np
from datetime import datetime
ts3= pd.Series(pd.to_timedelta(np.arange(10),unit='m'))
ts3
## 结果
# 0 0 days 00:00:00
# 1 0 days 00:01:00
# 2 0 days 00:02:00
# 3 0 days 00:03:00
# 4 0 days 00:04:00
# 5 0 days 00:05:00
# 6 0 days 00:06:00
# 7 0 days 00:07:00
# 8 0 days 00:08:00
# 9 0 days 00:09:00
# dtype: timedelta64[ns]
# 提取时间戳的秒数
sec = ts3.dt.seconds
sec
## 结果
# 0 0
# 1 60
# 2 120
# 3 180
# 4 240
# 5 300
# 6 360
# 7 420
# 8 480
# 9 540
# dtype: int64
sec2 = ts3.dt.to_pytimedelta()
sec2
## 结果
# array([datetime.timedelta(0), datetime.timedelta(seconds=60),
# datetime.timedelta(seconds=120), datetime.timedelta(seconds=180),
# datetime.timedelta(seconds=240), datetime.timedelta(seconds=300),
# datetime.timedelta(seconds=360), datetime.timedelta(seconds=420),
# datetime.timedelta(seconds=480), datetime.timedelta(seconds=540)],
# dtype=object)
575





