Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 若名称列的长度为<=1._Python_Pandas_Postgresql - Fatal编程技术网

Python 若名称列的长度为<=1.

Python 若名称列的长度为<=1.,python,pandas,postgresql,Python,Pandas,Postgresql,请指出我做错的地方或重复此问题 我的表中有11列,我正在将数据从Ceph(AWS)bucket加载到Postgres,在这样做的同时,我必须在将数据插入Postgres之前使用以下条件过滤数据 如果任何列中存在任何空/空值,则删除整行 名字和姓氏应该有多个字母。例如:first name=A或last name=P,任何记录,无论是first name还是last name或两者,都应该删除整个记录/行 邮政编码应为5位或以上。最多7位 名字和姓氏记录中不应包含[Jr、Sr、I、II等]。或者把

请指出我做错的地方或重复此问题

我的表中有11列,我正在将数据从Ceph(AWS)bucket加载到Postgres,在这样做的同时,我必须在将数据插入Postgres之前使用以下条件过滤数据

  • 如果任何列中存在任何空/空值,则删除整行
  • 名字和姓氏应该有多个字母。例如:first name=A或last name=P,任何记录,无论是first name还是last name或两者,都应该删除整个记录/行
  • 邮政编码应为5位或以上。最多7位
  • 名字和姓氏记录中不应包含[Jr、Sr、I、II等]。或者把整个记录都丢掉
  • 我已经成功地执行了第一步(对熊猫来说是新的),但是我在下一步被阻止了,我相信如果我找到了第二步的解决方案,它也可能帮助我解决第三步。在谷歌进行快速研究时,我发现使用块可能会使过程复杂化,可能必须使用“concat”将其应用于所有块,或者可能是我错了,但我正在处理大量数据,使用块可以帮助我更快地将数据加载到Postgres中。 我将在这里粘贴我的代码,并提及我尝试了什么,输出是什么,预期的输出是什么

    我尝试的是:

    列=[
    “客户最后一个月”,
    “客户第一时间”,
    “客户服务”,
    “客户性别cd”,
    “客户邮寄cd”,
    “独立输入id”,
    “令牌_1”,
    “TOKEN_2”,
    “TOKEN_3”,
    “TOKEN_4”,
    “令牌密钥”
    ]
    
    def每周推送至页面(按键):
    万特=[]
    打印(键)
    密钥=\u下载\u s3(密钥)
    推送了多少个文件。追加(True)
    s=sp.Popen([“wc”,“-l”,键],stdout=sp.PIPE)
    a、 b=s.沟通()
    总计行数=int(a.split()[0])
    行数=0
    data=pd.read_csv(key,sep=“|”,header=None,chunksize=100000)
    对于数据中的块:
    行+=len(块)
    打印(“已处理行:”,(浮动(行)/总计行)*100)
    chunk=chunk.dropna(axis=0)#步骤1删除至少缺少一个元素的行。
    索引_name=chunk[(len(chunk[0])
    
  • 在dataframe中创建一个新列,其长度值为:

    df['name\u length']=df.name.str.len()

  • 使用新列编制索引:

    df=df[df.name\u length>1]


  • 在大熊猫身上进行类似操作的最快方法是通过numpy.where

    例如,对于字符串长度:

    data = data[np.where((data['cust_last_nm'].str.len()>1) & 
             (data['cust_frst_nm'].str.len()>1), True, False)]
    
    注意:您可以以相同的方式添加邮政编码条件。默认情况下,在您的数据中,邮政编码将以
    浮动的形式读入,因此请先将其转换为字符串,然后设置长度限制:

    ## string length & postal code conditions together
    data = data[np.where((data['cust_last_nm'].str.len()>1) & 
             (data['cust_frst_nm'].str.len()>1) &
             (data['cust_postl_cd'].astype('str').str.len()>4) &
             (data['cust_postl_cd'].astype('str').str.len()<8)
              , True, False)]
    

    感谢您的回答,仅供参考,我正在使用python3.6,但是我得到了以下错误:data=data[np.where((data['cust_last_nm'].str.len()>1)和(data['cust_first_nm'].str.len()>1),True,False)]TypeError:'TextFileReader'对象不可订阅。我还尝试了data[0],data[1],而不是显式使用列名,但得到了相同的错误,Thankst这假设您有一个包含列['cust_last_nm','cust_postl_cd']的pandas数据帧。由于您在块中运行它,您需要在循环中的块上测试它。已工作!:)实际上它应该是块[4]对于邮政编码,对吗?我知道邮政cd的值很奇怪,尽管(606.0)可能是它的值,因为我分配了[字符变化]按照postgres中给我的指示为它输入数据。无论如何,它像一个符咒一样工作,我将接受这一点作为答案。我的最后一个问题是为什么chunk语句中同时列出了True和False?很好知道!如果你不介意的话,那么将答案向上投票;)True和False是np.where子句的一部分,它基本上具有str结构,np.其中(,).I在这种情况下,我创建了一个列,在条件匹配时标记为'true',否则标记为'false'。然后我将此作为索引传递给块,块进行筛选,只保留真正的匹配项。请详细说明,您的意思是添加一个新列吗?我有两个要筛选的名称列,所以创建两个新列?我可能会明显误解nding。您正在添加一列name_length,该列将包含该行中存在的名称的长度。然后,我们将根据长度筛选该数据帧,即name_length列的数字应大于1
    john|doe|1974-01-01|F|606.0|113955973|cC80fi6kHVjKRNgUnATuE8Nn5x/YyoTUdSDY3sUDis4=|2qalDHguJRO9gR66LZcRLSe2SSQSQAIcT9btvaqLnZk=|eLQ9vYAj0aUfMM9smdpXqIh7QRxLBh6wYl6iYkItz6g=|3ktelRCCKf1CHOVBUdaVbjqltxa70FF+9Lf9MNJ+HDU=|cigna_TOKEN_ENCRYPTION_KEY
    jh|on|1989-01-01|M|381.0|133794239|PvCWdh+ucgi1WyP5Vr0E6ysTrTZ1gLTQIteXDxZbEJg=|7K3RsfC8ItQtrEQ+MdBGpx6neggYvBvR8nNDMOBTRtU=|nHsF/rJFM/O+HPevTj9cVYwrXS1ou+2/4FelEXTV0Ww=|Jw/nzI/Gu9s6QsgtxTZhTFFBXGLUv06vEewxQbhDyWk=|cigna_TOKEN_ENCRYPTION_KEY
    
    data = data[np.where((data['cust_last_nm'].str.len()>1) & 
             (data['cust_frst_nm'].str.len()>1), True, False)]
    
    ## string length & postal code conditions together
    data = data[np.where((data['cust_last_nm'].str.len()>1) & 
             (data['cust_frst_nm'].str.len()>1) &
             (data['cust_postl_cd'].astype('str').str.len()>4) &
             (data['cust_postl_cd'].astype('str').str.len()<8)
              , True, False)]
    
    chunk = chunk[np.where((chunk[0].astype('str').str.len()>1) & 
             (chunk[1].astype('str').str.len()>1) &
             (chunk[5].astype('str').str.len()>4) &
             (chunk[5].astype('str').str.len()<8), True, False)]