python向csv填充空值_python数据截取(抽取)

ae2280e77b25f247660f775c737084f7.png

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

b06a9f796e945e7f5b8c3acd155415fd.png

结合网络优秀案例,完成一千多行数据截取

  • 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值