楼主: scarlett_0405
3281 9

[问答] 怎样把字符串的数字提取出来,但是要有对应关系 [推广有奖]

  • 0关注
  • 0粉丝

大专生

48%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
1772 点
帖子
44
精华
0
在线时间
40 小时
注册时间
2012-10-4
最后登录
2021-1-12

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
大神们好

有一个这样的需求,就是有两列数据,一列为编号,一列为文本信息,其中想把文本信息里的数字摘出来,如下的效果

编号文本信息摘取效果
1中国爱1002

1002

2北美也开户2020

2020

3我的手机13500122203

13500122203

4 
5爱护我的39212门户

39212

6 
7原来是这样的号23222003

23222003

8 
9 
10演练在这988222

988222

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝


回帖推荐

  1. import pandas as pd
  2. import re

  3. #####方法一(不能处理“我爱123北京456天安门”)
  4. #构造数据
  5. content = ['中国爱1002',
  6.            '北美也开户2020',       
  7.            '我的手机13500122203',
  8.            '',
  9.            '爱护我的39212门户',
  10.            '',
  11.            '原来是这样的号23222003',
  12.            '',
  13.            '',
  14.            '演练在这988222']

  15. df = pd.DataFrame({'id':range(len(content)),
  16.                    'content':content})
  17.    
  18. numlist = [str(i) for i in range(10)]   
  19. def getNum(x):
  20.     #x = '爱护我的39212门户'
  21.     s_num = ''
  22.     for i, s in enumerate(x):
  23.         if s in numlist:
  24.             s_num += s   
  25.     return s_num

  26. #获取数字   
  27. df['result'] = df['content'].apply(lambda x:getNum(x))

  28. ###方法二
  29. content = ['中国爱1002',
  30.            '北美也开户2020',       
  31.            '我的手机13500122203',
  32.            '',
  33.            '爱护我的39212门户',
  34.            '',
  35.            '原来是这样的号23222003',
  36.            '',
  37.            '',
  38.            '演练在这988222']

  39. df = pd.DataFrame({'id':range(len(content)),
  40.                    'content':content})

  41. df['content'] = df['content'] + 'isend'
  42.    
  43. def getNum(x):
  44.     #x = '爱护我的39212门户isend'
  45.     #x = '我爱123北京456天安门isend'
  46.     model = '([\d]*?)[^\d]'
  47.     data = re.findall(model, x)
  48.     return [s for s in data if s!='']

  49. df['result'] = df['content'].apply(lambda x:getNum(x))
复制代码

使用道具

重复了,删除

使用道具

板凳
baicel21314 发表于 2017-9-6 16:56:38 |只看作者 |坛友微信交流群
学习下正则表达式,简单到爆。。

使用道具

报纸
scarlett_0405 发表于 2017-9-7 09:46:45 |只看作者 |坛友微信交流群
fengxingliulizi 发表于 2017-9-6 10:48
重复了,删除
如果我是从文本文件或者excel文件里读取这个文本list呢,我尝试了一下,发现有问题,能帮忙看看代码吗?

所需文件: beizhu1.xlsx (9 KB)

import re
import pandas as pd
import numpy as np
content=pd.read_excel(r'D:\beizhu1.xlsx')

df = pd.DataFrame({'id':range(len(content)),
                   'ct':content['文本信息']})

df['ct'] = str(df['ct'])
   
def getNum(x):
    model = '([\d]*?)[^\d]'
    data = re.findall(model, x)
    return [s for s in data if s!='']

df['result'] = df['ct'].apply(lambda x:getNum(x))

writer = pd.ExcelWriter('beizhu_output.xlsx')

df.to_excel(writer, sheet_name='invitecode')
writer.save()
error.png


使用道具

scarlett_0405 发表于 2017-9-7 09:46
如果我是从文本文件或者excel文件里读取这个文本list呢,我尝试了一下,发现有问题,能帮忙看看代码吗?
...
那是因为有些是NaN,而我之前这些空值设置的是‘’。修改代码如下
  1. import re
  2. import pandas as pd
  3. import numpy as np
  4. content=pd.read_excel(r'D:\beizhu1.xlsx')

  5. df = pd.DataFrame({'id':range(len(content)),
  6.                    'ct':content['文本信息']})

  7. df['ct'] = df['ct'] + 'isend'
  8.    
  9. def getNum(x):
  10.     try:
  11.         model = '([\d]*?)[^\d]'
  12.         data = re.findall(model, x)
  13.         return [s for s in data if s!='']
  14.     except:
  15.         return None

  16. df['result'] = df['ct'].apply(lambda x:getNum(x))

  17. writer = pd.ExcelWriter('beizhu_output.xlsx')

  18. df.to_excel(writer, sheet_name='invitecode')
  19. writer.save()
复制代码




使用道具

7
scarlett_0405 发表于 2017-9-7 15:26:00 |只看作者 |坛友微信交流群
fengxingliulizi 发表于 2017-9-7 13:33
那是因为有些是NaN,而我之前这些空值设置的是‘’。修改代码如下
非常非常感谢,真是大神呀

操作中还有一个问题是,如果文本信息里是纯数值的,那这句df['ct'] = df['ct'] + 'isend',执行的时候就会出现类型不匹配的,错误如下:TypeError: unsupported operand type(s) for +: 'float' and 'str'

我尝试着类型转化,但是不对df['ct'] = str(df['ct']) + 'isend'

还请您解答一下,谢谢您

使用道具

8
fengxingliulizi 发表于 2017-9-8 09:31:47 |只看作者 |坛友微信交流群
scarlett_0405 发表于 2017-9-7 15:26
非常非常感谢,真是大神呀

操作中还有一个问题是,如果文本信息里是纯数值的,那这句df['ct'] = df['c ...
把df['ct'] = str(df['ct']) + 'isend'删了,我修改了getNum()
  1. def getNum(x):
  2.     if numpy.isnan(x):
  3.         return None
  4.     elif isinstance(x,str):
  5.         x = x + 'isend'
  6.         model = '([\d]*?)[^\d]'
  7.         data = re.findall(model, x)
  8.         return [s for s in data if s!='']
  9.     elif isinstance(x,float) or isinstance(x,int):
  10.         return x
复制代码


使用道具

9
fengxingliulizi 发表于 2017-9-8 09:32:14 |只看作者 |坛友微信交流群
scarlett_0405 发表于 2017-9-7 15:26
非常非常感谢,真是大神呀

操作中还有一个问题是,如果文本信息里是纯数值的,那这句df['ct'] = df['c ...
把df['ct'] = str(df['ct']) + 'isend'删了,我修改了getNum()
  1. def getNum(x):
  2.     if numpy.isnan(x):
  3.         return None
  4.     elif isinstance(x,str):
  5.         x = x + 'isend'
  6.         model = '([\d]*?)[^\d]'
  7.         data = re.findall(model, x)
  8.         return [s for s in data if s!='']
  9.     elif isinstance(x,float) or isinstance(x,int):
  10.         return x
复制代码


使用道具

scarlett_0405 发表于 2017-9-7 15:26
非常非常感谢,真是大神呀

操作中还有一个问题是,如果文本信息里是纯数值的,那这句df['ct'] = df['c ...
把df['ct'] = str(df['ct']) + 'isend'删了,我修改了getNum()
  1. def getNum(x):
  2.     if numpy.isnan(x):
  3.         return None
  4.     elif isinstance(x,str):
  5.         x = x + 'isend'
  6.         model = '([\d]*?)[^\d]'
  7.         data = re.findall(model, x)
  8.         return [s for s in data if s!='']
  9.     elif isinstance(x,float) or isinstance(x,int):
  10.         return x
复制代码


使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-11-6 05:09