从同一“区街道路村楼单元层”提取出缺失的房号,就是在第二列“房号”中,从最小到最大之间缺失的房号

目前手里有个表格,需要从同一“区街道路村楼单元层”提取出缺失的房号,就是在第二列“房号”中,从最小到最大之间缺失的房号。
本来是用了正则表达式,打算提取房号中的数字,然后从小到大进行比较,但是目前有两个问题:
1、同一街道这一块不知道应该怎么表述;
2、正则表达式提取出来的是个数组,没法进行大小比较。
目前想到的只有以下这些,小弟初学python想请哪位大哥指导一下,谢谢。
exported_alljob_path = r'C:/biaogezhuanyong/d.csv'##########定义打开文件
alljob = pd.read_csv(exported_alljob_path,encoding= 'gb18030')
alljob.loc[:,'区街道路村'] = alljob.loc[:,'所属区县'].str.cat(alljob['所属乡镇/街道']).\
str.cat(alljob['所属路/巷/行政村']).str.cat(alljob['所属小区/学校/自然村'])

col= ['所属区县','所属乡镇/街道','所属路/巷/行政村','所属小区/学校/自然村','所属楼','所属单元','所属层','区街道路村楼单元层','房号']
alljob_new = pd.DataFrame(alljob_first,columns = col)

daima = []
def re_1(i):
res = re .findall(r"\d+",i)
return res
alljob['层号2'] = alljob.apply(lambda x: re_1(x['所属层']),axis=1)

图片说明

以上是原始表格的截图。
以下是原始表格的数据:
区街道路村楼单元层 房号
海东街道西毛家庄西毛家庄00单元0层 1号
海东街道西毛家庄西毛家庄00单元0层 2号
海东街道西毛家庄西毛家庄00单元0层 52号
海东街道西毛家庄西毛家庄00单元0层 53号
海东街道西毛家庄西毛家庄00单元0层 54号
海东街道西毛家庄西毛家庄00单元0层 55号
海东街道西毛家庄西毛家庄00单元0层 56号
海东街道西毛家庄西毛家庄00单元0层 57号
海东街道西毛家庄西毛家庄00单元0层 98号
海东街道西毛家庄西毛家庄00单元0层 100号
海东街道西毛家庄西毛家庄00单元0层 136号
海东街道教师楼1号楼1单元1层 102号
海东街道教师楼1号楼1单元1层 101号
海东街道教师楼1号楼2单元2层 202号
海东街道教师楼1号楼2单元5层 501号
海东街道教师楼1号楼2单元6层 602号
海东街道后海西村后海西村000 后海西村3号
海东街道后海西村后海西村000 后海西村10号
海东街道后海西村后海西村000 后海西村11号
海东街道后海西村后海西村000 后海西村20号
海东街道后海西村后海西村000 后海西村21号
海东街道后海西村后海西村000 后海西村22号
海东街道后海西村后海西村000 后海西村23号
海东街道后海西村后海西村000 后海西村24号
海东街道后海西村后海西村000 后海西村25号

实在不好意思,之前是我描述的不够清晰,我想再补充一点,想找的不是一个街道的,而是以“同一小区同一楼同一单元同一层”下缺失的房号。

1个回答

有些细节可能您也没交代清楚,我就按照我的理解了。我生成了两个街道一个是海东街道一个是海西街道。
基本思路是先提取出有哪些街道,遍历街道这是第一层
第二层遍历每个街道下的所有Data,找出门牌号的集合
生成1到最大门牌号的集合,并将其与上述门牌号的集合不同的元素提出来也即你需要的缺失的门牌号?
如果有我忽略的细节再补充吧,我再修改
Python 3.7
20191119更新
提供个思路
原始数据您可以再挖掘下

# Import
import pandas as pd
import os 
import re
import pdb

# Specify
root = '/Users/edward/Projects/Python/CSDN_Help/20191111_regula-rexpression/'
os.chdir(root)
data = pd.read_csv('data.csv')
result = pd.DataFrame()
loop1 = list(set(data['所属小区/学校/自然村'].to_list()))
for ls in ['loc','miss']:
    locals()[ls] = []

# Major
for xiaoqu in loop1:
    loop2 = list(set(data.loc[data['所属小区/学校/自然村']==xiaoqu]['所属楼'].to_list()))
    for lou in loop2:
        loop3 = list(set(data.loc[data['所属小区/学校/自然村']==xiaoqu][data['所属楼']==lou]['所属单元'].to_list()))
        for danyuan in loop3:
            loop4 = list(set(data.loc[data['所属小区/学校/自然村']==xiaoqu][data['所属楼']==lou][data['所属单元']==danyuan]['所属层'].to_list()))
            for ceng in loop4:
                lk = list(set(data.loc[data['所属小区/学校/自然村']==xiaoqu][data['所属楼']==lou][data['所属单元']==danyuan][data['所属层']==ceng]['房号'].to_list()))
                tmp = []
                for i in lk:
                    t = re.sub('\D', '' , i)
                    tmp.append(t)
                tmp = list(set(tmp))
                if len(tmp) < 2:
                    locals()['loc'].append(f'{xiaoqu}{lou}{danyuan}{ceng}')
                    if int(tmp[0][2]) == 1:
                        m = tmp[0][0:2]+'2'
                    else:
                        m = tmp [0][0:2]+'1'
                    locals()['miss'].append(m)
                if len(tmp) > 2:
                    contrast = []
                    locals()['loc'].append(f'{xiaoqu}{lou}{danyuan}{ceng}')
                    for i in range(int(min(tmp)),int(max(tmp))):
                        contrast.append(str(i))
                    m = list(set(contrast) ^ set(tmp))
                    locals()['miss'].append(list(set(m)))

result['缺失地址'] = locals()['loc']
result['缺失房号'] = locals()['miss']
result.to_csv('result.csv', index=None)
allen5211985
allen5211985 回复Edward_LA: 请问list(set)是什么意思,我在网上百度也没找到具体的含义。
2 个月之前 回复
allen5211985
allen5211985 回复Edward_LA: 收到,我研究研究,非常感谢
2 个月之前 回复
qq_42725942
Edward_LA 这个基于的是您的原始数据,记得修改root路径
2 个月之前 回复
qq_42725942
Edward_LA 回复allen5211985: 正在弄
2 个月之前 回复
allen5211985
allen5211985 大哥,是不是一直没倒出空来。。
2 个月之前 回复
allen5211985
allen5211985 回复Edward_LA: 好的,非常感谢
2 个月之前 回复
qq_42725942
Edward_LA 回复allen5211985: 收到了 最近比较忙 周末帮您弄一下
2 个月之前 回复
allen5211985
allen5211985 回复Edward_LA: 请问邮件收到了吗?
2 个月之前 回复
qq_42725942
Edward_LA 回复allen5211985: 嗯 我看一下
2 个月之前 回复
allen5211985
allen5211985 回复Edward_LA: 昨天发的,要求我在邮件里面又写了一下,不知道描述的清不清晰
2 个月之前 回复
qq_42725942
Edward_LA 回复allen5211985: 好
2 个月之前 回复
allen5211985
allen5211985 回复Edward_LA: 发过去了,请查收一下
2 个月之前 回复
qq_42725942
Edward_LA 回复allen5211985: 407805173@qq.com
3 个月之前 回复
allen5211985
allen5211985 回复Edward_LA: 表格好像没法直接上传啊,大哥邮箱方便说一下吗
3 个月之前 回复
allen5211985
allen5211985 回复Edward_LA: 可以,我一会传上来
3 个月之前 回复
allen5211985
allen5211985 回复Edward_LA: 如果只有单独一户的这种可以直接过滤掉,当做无用数据,只是这个循环还没想好怎么写
3 个月之前 回复
qq_42725942
Edward_LA 回复allen5211985: 如果方便的话 你回头可以把你的实际数据修改一下 发给我看看 目前已知的这些我找不到规律
3 个月之前 回复
qq_42725942
Edward_LA 回复allen5211985: 数据太乱了 我找不到啥规律 而且我觉得这样你也找不到同一层缺少的房号,因为比如你“海东街道教师楼1号楼2单元6层 602号”,这一层就只有一个啊,你除非指定清楚每一层最大是10户,但是你怎么又能保证每一栋楼每一层都是10户呢哈哈哈哈哈
3 个月之前 回复
qq_42725942
Edward_LA 回复allen5211985: 我先做一个假设 字段中包含“0单元和0层”的这种就是村对吧
3 个月之前 回复
allen5211985
allen5211985 回复Edward_LA: 好的,非常感谢,其实之前也写过一个CSV数据分析的程序,当时还比较简单点,基本上也就是用到书上哪些个功能,但是这个感觉有点超纲了,写了好几天了,也没点进步,看了您给写的还算是稍微有点头绪了。
3 个月之前 回复
qq_42725942
Edward_LA 回复allen5211985:我觉得其实就是回归最本质的东西,你要知道Pandas他什么操作返回的是一个什么,是一个列表还是一个字典?是一个文本还是一个数值?Pandas作为数据分析的模块最重要的不是他本身能做什么,而是我们用到他返回给我们的东西用我们的逻辑能拿来做什么,所以一定要对于Python基本数据结构、数值类型、逻辑运用等等有一个清楚的了解才能好好的掌握这门机能。你完全可以以你这个问题作为一次契机,去尝试解决这个问题,我有空修改一下你说的功能实现,你自己也可以多做尝试
3 个月之前 回复
allen5211985
allen5211985 还想请教一下吗,虽然pandas基础我都看完了,但是怎么样才能把各种函数功能都熟练的捏合在一起使用呢
3 个月之前 回复
allen5211985
allen5211985 回复Edward_LA: 是的,是具体到同个村/楼里的同一个单元同一层之中缺少的,如果是村的话就是同一个村中缺少的,如果是楼房就是同一单元同一层中缺少的;
3 个月之前 回复
qq_42725942
Edward_LA 回复allen5211985: 如果可以的话 要求再详细给我一下 是想知道每一层都缺多少户这样吗
3 个月之前 回复
allen5211985
allen5211985 第一段报错的问题已经解决,不好意思。
3 个月之前 回复
allen5211985
allen5211985 大哥,有个疑问,tmp.append(DATA.iloc[i]['房号'].split('号')[0])这一步是不是为了提取数字,但是最底下9行,格式是不同于前面几行的,他是“后海西村**号”这种格式的,所以提取出来的是“后海西村+数字”这种格式的。是不是后面就法执行了
3 个月之前 回复
allen5211985
allen5211985 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-19-b58698d30362> in <module> 9 result = pd.DataFrame() 10 JieDao = [] ---> 11 for i in DATA['区街道路村楼单元层'].to_list(): 12 JieDao.append(i.split('街道')[0]) 13 JieDao = set(JieDao) TypeError: string indices must be integers
3 个月之前 回复
allen5211985
allen5211985 我跑了一下,第一段报错了:
3 个月之前 回复
allen5211985
allen5211985 海东街道教师楼1号楼2单元5层 501号,这种我本来是打算直接过滤掉的,因为不知道一个单元到底多少户,但是还没想到那一步
3 个月之前 回复
allen5211985
allen5211985 谢谢大哥,我先学习一下,有什么问题再请教。
3 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问