【pandas】提取证件号年龄,省份,日期数据

import pandas as pd
import datetime
def pro_in(id):
#     pro_dict = {11:"北京",12:"天津"}
    pro_dict = {
        '11': "北京",
        '12': "天津",
        '13': "河北",
        '14': "山西",
        '15': "内蒙古",
        '21': "辽宁",
        '22': "吉林",
        '23': "黑龙江",
        '31': "上海",
        '32': "江苏",
        '33': "浙江",
        '34': "安徽",
        '35': "福建",
        '36': "江西",
        '37': "山东",
        '41': "河南",
        '42': "湖北",
        '43': "湖南",
        '44': "广东",
        '45': "广西",
        '46': "海南",
        '50': "重庆",
        '51': "四川",
        '52': "贵州",
        '53': "云南",
        '54': "西藏",
        '61': "陕西",
        '62': "甘肃",
        63: "青海",
        64: "宁夏",
        65: "新疆",
        71: "台湾",
        81: "香港",
        82: "澳门",
        91
        : "国外"
        }
    if pro_dict.get(id) is not None:
        return pro_dict[id]
    else:
        return "无"

if __name__ =="__main__":   
    df = pd.read_csv(r'D:\test\re_an.txt',names = ['idnumber'])
    print(df.dtypes)
    df1 = df['idnumber']
  
    df['pro_vince'] = df1.str[0:2]
#     df['pro_vince'] = pd.to_numeric(df['pro_vince'])
    df['year'] = df1.str[6:10]
    print(df['year'].dtype)
    df['year'] = pd.to_numeric(df['year'])
    df['month'] = df1.str[10:12]
    df['month'] = df['month'].astype(int)
    df['sex'] = df1.str[16:17]
#     改变数据类型
    df['sex'] = pd.to_numeric(df['sex'])
    df['省份'] = df['pro_vince'].apply(pro_in)
#     print(df['省份'])
    df['性别'] = df['sex'].apply(lambda x:0 if x%2==0 else 1)
#     print(df['性别'])
    now = datetime.datetime.now()
    now_year = now.year
    now_month = now.month
    print(type(now_year))
    df['year1'] = now_year-df['year']-1
    df['month1'] =df['month'].apply(lambda x:1 if x < now_month else 0)
    df['年龄'] = df['year1']+df['month1']
    df2 = df[['省份','年龄','性别']]
    df2.to_csv(r'D:\test\re__an_te1.txt')
    print('finished')

不用for循环,这是用另外一种方法提取年龄,性别,省份数据

知识点一:

这段直接用if pro_dict[id] is not None 报错keyerror'43',查了一下,发现如果不确定key在字典里,要用dict.get(),上一个代码没有报错是因为所有的key 都在字典里;

if pro_dict.get(id) is not None:
        return pro_dict[id]

知识点二: 新建了太多列,但是仅要保留某些列的数据

使用场景一:如果有一堆工作簿,每个工作簿仅想要部分列的数据

先遍历文件夹,然后读取文件的时候指定列数即可

试了一下用txt不支持这个功能?目前试了Excel和csv可以

 使用场景二:跟我这次情况一样,新建了太多辅助列,返回的文件不要这些列:

保留想要的列
方法1:
df=df.loc[:,[‘name1’,‘name2’,‘name3’]]
方法2:
df2=df[[‘name1’,‘name2’,‘name3’]]
删除指定列
方法1:指定列名删除
df.drop([‘name1’,‘name2’],axis=1,inplace=True)
方法2:指定列数删除
df.drop(df.columns[0:n], axis=1, inplace=True)
————————————————
版权声明:本文为CSDN博主「葵青」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_50723672/article/details/115203198

知识点三:数据类型错误

注意数据类型不一致导致的错误,str类型无法加减,会报错;int32和int64似乎是可以加减的?

最好开始处理数据前就先查看一下各个列的数据类型,这样更清楚;查看整个表的数据类型:df.dtypes,或者用df.info() 也行;查看某一列,则是,df['year'].dtype

pandas里的数据类型转换

3.1、整个转换数据类型

试了一下,如果整个文本转换,比较方便,但有局限,比如有文本和数字,要都转为int会报错;

3.2、单列或者多列转换为指定的数据类型

3.2.1、单列:str转换成数字类型:pd.to_numeric(data),返回的数据为float64或者int64

把某列转成:df['year'] = pd.to_numeric(df['year'])

如果有部分数据无法转为int类型,可以用参数error来设定为nan,或者直接忽略

df['年龄2'] = pd.to_numeric(df['年龄'],errors = 'coerce')
df['年龄1'] = pd.to_numeric(df['年龄'],errors = 'ignore')

df['年龄2']的类型是float64,但是df['年龄1']的数据类型变成了object

3.2.2、 多列转换用apply函数来转换,用ignore

df1 = df[['年龄','性别']].apply(pd.to_numeric,errors = 'ignore')

转换整个表

df = df.apply(pd.to_numeric,errors = 'ignore')

astype也可以转换数据类型:

astype的参数如果是int,float 同理,用不用引号都可,但是如果用具体的int32,int64则要,不然会报错

df['month'] = df['month'].astype(int32)

df1 = df[['年龄','性别']].astype(int32)

多列,还可以指定转换

df1 = df.astype({'年龄':'int32','性别':'int64'},errors = 'ignore')

更多请见:http://t.csdn.cn/DZ2lJ

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值