【问题标题】:return all the variables at once一次返回所有变量
【发布时间】:2020-05-06 08:02:30
【问题描述】:

嘿,我正在做数据验证,如果都满足我当前的代码,我想比较多个正则表达式条件变量

def upload_file():
    if request.method == 'POST':
        print(request.files['file'])
        f = request.files['file']
        data_xls = pd.read_excel(f)
        df2 = data_xls.reset_index()
        name_filter = df2[df2['Pensioner Name'].str.match('^[a-zA-Z\s\.]*$')]
        cnic_filter = df2[df2['CNIC'].str.match('^[\'][0-9+]{5}-[0-9+]{7}-[0-9]{1}[\']$')]
        wallet_filter = df2[df2['Wallet Account No'].astype(str).str.contains('^[0-9+]{8}$')]
        mobile_filter = df2[df2['Mobile Number'].astype(str).str.contains('^[3+][0-9+]{9}$')]
     return name_filter.to_html() 

如何一次返回所有变量,验证所有正则表达式现在它唯一返回的 name_filter

谢谢

【问题讨论】:

    标签: python regex pandas


    【解决方案1】:

    我试过了,它对我有用。虽然条件不满足。它仍然有效。

    import pandas as pd
    
    df2 = pd.DataFrame(
        {'Pensioner Name' : ['CHANESER','CHANESERS'],
         'CNIC' : ['41207-0800205-9','41207-0800205-9'],
         'Wallet Account No' : ['BDS00229','BDS00229'],
         'MobileNumber' : ['3203501312','3203501312']
         }
    )
    
    
    
    if df2[df2['Pensioner Name'].str.match('^[a-zA-Z\s\.]*$')].equals(df2['Pensioner Name']) and \
    df2[df2['CNIC'].str.match('^[\'][0-9+]{5}-[0-9+]{7}-[0-9]{1}[\']$')].equals(df2['CNIC'])and \
    df2[df2['Wallet Account No'].astype(str).str.contains('^[0-9+]{8}$')].equals(df2['Wallet Account No'].astype(str)) and \
    df2[df2['Mobile Number'].astype(str).contains('^[3+][0-9+]{9}$')].equals(df2['Mobile Number'].astype(str)):
        print("works!")
    else:
        print("not works!")
    

    【讨论】:

      【解决方案2】:

      基本上,您不是验证一个结果,而是验证所有结果并将它们过滤掉。

      所以假设你希望所有的结果都通过并且是真的并且它们都是真的情况。

      # COMPARE IF THE SAME DATASETS ARE PRESENT, EVEN AFTER PASSING ALL THE CONDITIONS AS TRUE
      if df2[df2['Pensioner Name'].str.match('^[a-zA-Z\s\.]*$'].equals(df2['Pensioner Name'])     and df2[df2['CNIC'].str.match('^[\'][0-9+]{5}-[0-9+]{7}-[0-9]{1}[\']$'].equals(df2['CNIC'])     and df[df2['Wallet Account No'].astype(str).str.contains('^[0-9+]{8}$'].equals(df2['Wallet Account No'].astype(str)) and  df2[df2['Mobile Number'].astype(str).contains('^[3+][0-9+]{9}$')].equals(df2[['Mobile Number'].astype(str)):
          return df2.to_html()
      else:
          return '''<h2> Error in data </h2>'''
      
      

      【讨论】:

      • 感谢@High-Octane 的回答,但我现在收到这样的错误 TypeError: unsupported operand type(s) for &: 'str' and 'bool'
      • 你能分享一组虚拟数据样本让我检查吗?
      • 养老金领取者姓名 CNIC 申请号 钱包账户号 手机号 CHHANESER 41207-0800205-9' 'BDS00229' 25358000 3203501312
      • 是这样的,请暂时忽略索赔
      • 你能转换你所有的列如下吗? df2['Pensioner Name'] = df2['Pensioner Name'].astype(str) 然后再试试其他代码?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-08
      • 2019-06-13
      • 2017-07-02
      • 2022-01-15
      • 2016-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多