比较2个 Dataframe 和转换数据之间的值

qoefvg9y  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(305)

此脚本的主要目的是将csv中数据的正则表达式格式与该国家的官方邮政编码正则表达式格式进行比较,如果格式不匹配,脚本将对所述数据执行转换,并在一个最终 Dataframe 中输出所有数据。
我有两个csv文件,一个(countries.csv)包含以下列和数据示例
输入:
联系idcountryzip代码1USA712932ITALYIT 2310219
和另一个csv(regex.csv),其中包含以下数据示例:
countryregex formatusa[0-9]{5}(?:-[0-9]{4})?意大利\d{5}
现在,第一个csv有大约35k条记录,所以我想创建一个函数,它通过regex.csv(dataframe)循环来获取country列和regex。然后它将循环遍历国家列表以获取regex['country']==countries['country']所在的每个示例,并将regex转换应用于该国家的邮政编码。
到目前为止,我有这个功能,但我不能让它工作。

def REGI (dframe):
    dframe=pd.DataFrame().reindex_like(contacts)
    cols = list(contacts.columns)

    for index,row in mergeOne.iterrows():
        country = (row['Country'])
        reg = (row[r'regex'])

        for i, r in contactsS.iterrows():
            if (r['Country of Residence'] == country or r['Country of Residence.1'] == country or r['Mailing Country (text only)'] == country or r['Other Country (text only)'] == country) :
                dframe.loc[i] = r

        dframe['Mailing Zip/Postal Code']=dframe['Mailing Zip/Postal Code'].apply(str).str.extractall(reg).unstack().apply(lambda x:','.join(x.dropna()), axis=1)
    contacts.loc[contacts['Contact ID'].isin(dframe['Contact ID']),cols] = dframe[cols]
    dframe = dframe.dropna(how='all')

    return dframe

['contact id']正被用作标识符列。
第二个for循环独立工作,但是我需要手动重新键入新的 Dataframe 名称、regex和国家名称(没有第一个for循环)。
目前我得到以下错误:valueerrorvalueerror:模式不包含捕获组
删除了一些列以模拟上面给出的 Dataframe 示例&errorerror continued
如果我将结果粘贴到新的 Dataframe 中,它将返回以下内容:results in a new dataframe
示例作为文本
账户idcountryzip/邮政编码1联合 Realm WV5爱尔兰2 EO293拉脱维亚10094联合 Realm 2 JE5ITALY22010
正则表达式表
国家统一 Realm ([gg][ii][rr]0[aa]{2})([a-za-z][a-ha-hj-yj-y][0-9]{1,2})([a-za-z][a-ha-hj-yj-y][0-9]?[a-za-z]))[0-9][a-za z]{2}拉脱维亚[l]{1}[v]{1}-{4}意大利以外的爱尔兰国家
联合 Realm 正则表达式:
([a-za-z][0-9]{1,2});([a-za-z][0-9]{1,2});([a-za-z][a-ha-hj-yj-y][0-9]{1,2});([a-za-z][0-9][a-za-z])([a-za-z][a-ha-hj-yj-y][0-9]?[a-za-z]))[a-za-z])

iqih9akk

iqih9akk1#

根据您对我的评论的回复,我建议您使用正则表达式直接修复邮政编码:

df3 = df2.set_index('Country')

df1['corrected_Zip'] = (df1.groupby('Country')
                           ['Zip Code']
                           .apply(lambda x: x.str.extract('(%s)' % df3.loc[x.name, 'Regex format']))
                        )
df1

它按国家分组,将正则表达式应用于该国家,并提取值。
输出:

Contact ID Country    Zip Code corrected_Zip
0           1     USA       71293         71293
1           2   Italy  IT 2310219         23102

注意。如果需要,可以直接覆盖 Zip Code 通过做 df1['Zip Code'] = … nb2。这只有在所有国家都加入的情况下才有效 df2 ,如果不是这样,您需要为此添加一个检查(让我知道)
nb3。如果您想知道哪些行的zip无效,可以使用以下方法获取它们:

df1[df1['Zip Code']!=df1['corrected_Zip']]

相关问题