python数据截取(抽取)
字段拆分
import pandas as pd
df=pd.Series.str.slice(start,stop)
参数说明
start
开始的索引
stop
结束的索引
数据准备
#数据准备import pandas as pddf=pd.read_csv('d:/python/out/slice.csv',encoding='utf8')df
按照位置拆分
#字段拆分#数据准备import pandas as pddf=pd.read_csv('d:/python/out/slice.csv',encoding='utf8')#将数值型转成字符型df['tel']=df['tel'].astype(str)#按运营商、地区、号段拆分bands=df['tel'].str.slice(0,3)ares=df['tel'].str.slice(3,7)nums=df['tel'].str.slice(7,11)#更新数据,将拆分好的数据,添加到数据框中df['bands']=bandsdf['ares']=aresdf['nums']=numsdf.to_csv('d:/python/out/slice_out.csv')df
按照分隔符拆分
import pandas as pd
df=pd.Series.str.split(pat='',n=-1,expand=False)
参数说明
pat
分隔符,默认为空格
n
分割为n+1列,-1代表返回所有的分割列
expand
是否展开为数据框,默认Fals,一般设置为True
数据准备
#按照分隔符拆分#数据准备import pandas as pddf=pd.read_csv('d:/python/out/split.csv',encoding='utf8')df
#按照分隔符拆分#重新命名每一列名字import pandas as pddf=pd.read_csv('d:/python/out/split.csv',encoding='utf8')#使用空格拆分成品牌、型号df_split=df['name'].str.split(' ',1,True) #1分隔成n+1列即分隔成两列,True展开为数据框#重新命名每一列名字df_split.columns=['band','name']df_split.to_csv('d:/python/out/split_out.csv')df_split
根据实际属性抽取
参数说明
second
0-59秒,从0开始,到59
minute
0-59分钟,从0开始,到59
hour
0-23小时,从0开始,到23
day
1-31:一个月中的第几天,从1开始,最大31
month
1-12月,从1开始,到12
year
年份
weekday
一周的第几天,0指定星期一,5星期六,6星期日
数据准备
#按时间属性抽取#数据准备import pandas as pddf=pd.read_csv('d:/python/out/datetime.csv',encoding='utf8')df
#按时间属性抽取import pandas as pddf=pd.read_csv('d:/python/out/datetime.csv',encoding='utf8')#将注册时间类转换成时间类型的数据,新生成时间列df['时间']=pd.to_datetime(df.注册时间,format='%Y/%m/%d %H:%M:%S')df['时间']
#按时间属性抽取import pandas as pddf=pd.read_csv('d:/python/out/datetime.csv',encoding='utf8')#将注册时间类转换成时间类型的数据,新生成时间列df['时间']=pd.to_datetime(df.注册时间,format='%Y/%m/%d %H:%M:%S')#抽取时间的各种属性,新增到对应的列中df['时间.年']=df['时间'].dt.yeardf['时间.月']=df['时间'].dt.monthdf['时间.周']=df['时间'].dt.weekdaydf['时间.日']=df['时间'].dt.daydf['时间.时']=df['时间'].dt.hourdf['时间.分']=df['时间'].dt.minutedf['时间.秒']=df['时间'].dt.seconddf.to_csv('d:/python/out/datetime_out.csv')df
记录抽取
import pandas as pd
df=pd.Series.str.contains(pat,cse=True,na=NAN)
参数说明
pat
要包含的字符
case
英文是否忽略大小写
na
缺失值的填充方式,默认为NaN,在过滤的场景,需要设置为False,也就是缺失值返回False
数据准备
#数据抽取#数据准备import pandas as pddf=pd.read_csv('d:/python/out/contains.csv',encoding='utf8')df
关键词抽取
#根据关键字抽取数据记录import pandas as pddf=pd.read_csv('d:/python/out/contains.csv',encoding='utf8')df_f=df[df.title.str.contains('台电',na=False)]df_f.to_csv('d:/python/out/contains_out.csv')df_f
空值抽取
#空值抽取import pandas as pddf=pd.read_csv('d:/python/out/contains.csv',encoding='utf8')df_f=df[df.title.isnull()]df_f
数据范围抽取
#数据范围抽取import pandas as pddf=pd.read_csv('d:/python/out/contains.csv',encoding='utf8')df_f=df[df.comments>10000]df_f
时间范围抽取
#时间范围抽取#先将ptime列,转换为时间类型数据import pandas as pddf=pd.read_csv('d:/python/out/contains.csv',encoding='utf8')df['ptime']=pd.to_datetime(df.ptime,format='%Y-%m-%d')df
#时间范围抽取import pandas as pdfrom datetime import datetime #从datetime某块中,引入datetime时间类型构造函数df=pd.read_csv('d:/python/out/contains.csv',encoding='utf8')df['ptime']=pd.to_datetime(df.ptime,format='%Y-%m-%d')#定义时间点1-2015年01月01日dt1=datetime(year=2015,month=1,day=1)#定义时间点2-2015年12月31日dt2=datetime(year=2015,month=12,day=31)#获取介于2015年1月1日和2015年12月31日之间的数据df_f=df[(df.ptime >=dt1)&(df.ptime<=dt2)]df_f.to_csv('d:\python\out\contains_out1.csv')df_f
组合条件抽取
#组合条件抽取import pandas as pddf=pd.read_csv('d:/python/out/contains.csv',encoding='utf8')#取反~df.title.str.contains('台电', na=False)df_f=df[~df.title.str.contains('台电', na=False)]df_f.to_csv('d:\python\out\contains_out2.csv')df_f
随机抽样
df=pd.DataFrame.sample(n,frac,replace=False)
参数说明
n
按个数抽样
frac
按百分比抽样,frac和n只能二选一
replace
可放回抽样,True可放回,False不可放回,默认False
数据准备
#随机抽样#数据准备import pandas as pddf=pd.read_csv('d:\python\out\sample.csv',encoding='utf=8')df
按个数随机抽样
#按个数抽样import pandas as pddf=pd.read_csv('d:\python\out\sample.csv',encoding='utf=8')df_s=df.sample(n=3)df_s
按百分比随机抽样
#按百分比抽样import pandas as pddf=pd.read_csv('d:\python\out\sample.csv',encoding='utf=8')df_s=df.sample(frac=0.2)df_s
是否放回抽样
#是否放回抽样import pandas as pddf=pd.read_csv('d:\python\out\sample.csv',encoding='utf=8')df_s=df.sample(n=3,replace=True)df_s
学习小结:
数据截取(抽取)即数据拆分--保留、抽取原数据表中某些字段、记录的部分信息,形成一个新字段、新记录,常见的主要包括:字段拆分、记录截取、随机抽样。
结合实际工作案例:
当条记录截取
#分割字符串使用 变量.split("分割标示符号"[分割次数]),分割次数表示分割最大次数,为空则分割所有jddstr = '中国福建省xx州市xx城区竹JJ局楼/中国福建省xx州市xx城区yy局楼10楼机房传输/111-x1553-P-yy1-HW-TM/6-SQ1-4《》6-SQ1-4/111-x1555-P-龙z1-HW-TM/龙z移动大楼五楼传输机房/aaa罗龙津局楼'strList1 = jddstr.split('/')# 用逗号分割str字符串,并保存到列表strList1=strList1[2:]strList1
#分割字符串使用 变量.split("分割标示符号"[分割次数]),分割次数表示分割最大次数,为空则分割所有jddstr = '中国福建省xx州市xx城区竹JJ局楼/中国福建省xx州市xx城区yy局楼10楼机房传输/111-x1553-P-yy1-HW-TM/6-SQ1-4《》6-SQ1-4/111-x1555-P-龙z1-HW-TM/龙z移动大楼五楼传输机房/aaa罗龙津局楼'strList1 = jddstr.split('/')# 用逗号分割str字符串,并保存到列表strList1=strList1[2:5]strList1
结合网络优秀案例,完成一千多行数据截取
Pandas拆分单元格为多行
核心代码:df.drop(['main_investigator_1'], axis=1).join(df['main_investigator_1'].str.split(',', expand=True).stack().reset_index(level=1, drop=True).rename('main_investigator_new'))
具体解释:
将需要拆分的数据使用split拆分工具拆分,并使用expand功能拆分成多列
将拆分后的多列数据进行列转行操作(stack),合并成一列
将生成的复合索引重新进行reset保留原始的索引,并命名
将上面处理后的DataFrame和原始DataFrame进行join操作,默认使用的是索引进行连接。
import pandas as pd# 读入Exceldf = pd.read_excel(r'C:\Users\admin\Desktop\test.xlsx')print(df['main_investigator_1'])# 第一步:拆分,生成多列print('第一步:拆分,生成多列')df_1 = df['main_investigator_1'].str.split(',', expand=True)print(df_1)# 第二步:行转列df_1 = df_1.stack()print('第二步:行转列')print(df_1)# 第三步:重置索引,并命名(并删除多于的索引),同时命名字段df_1 = df_1.reset_index(level=1, drop=True).rename('main_investigator_new')print('第三步:重置索引,并命名(并删除多于的索引)')print(df_1)# 第四步:和原始数据合并df_new = df.drop(['main_investigator_1'], axis=1).join(df_1)print('第四步:和原始数据合并')print(df_new)print('拆分前数据')print(df)
————————————————
版权声明:本文为CSDN博主「Jock2018」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_27283619/java/article/details/96164836