Python 若名称列的长度为<=1.
请指出我做错的地方或重复此问题 我的表中有11列,我正在将数据从Ceph(AWS)bucket加载到Postgres,在这样做的同时,我必须在将数据插入Postgres之前使用以下条件过滤数据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等]。或者把
列=[
“客户最后一个月”,
“客户第一时间”,
“客户服务”,
“客户性别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)]