如果列与特定字符串匹配,则在dataframe中删除行

2024-05-20 01:32:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图遵循前面提到的流程here,但它对我来说不起作用(完全),因此请指出我可能丢失的任何副本,因此以下是我被阻止的要求 在将数据插入Postgres之前,我尝试使用以下条件过滤数据

名字和姓氏列中不应包含[Jr、Sr、I、II等]。或者删除整个记录/行

columns = [
        'cust_last_nm',
        'cust_frst_nm',
        'cust_brth_dt',
        'cust_gendr_cd',
        'cust_postl_cd'
    ]
def push_to_pg_weekly(key):
    total_rows = int(a.split()[0])
    rows = 0
    for chunk in pd.read_csv(key, sep="|", header=None, chunksize=100000):
        rows += len(chunk)
        chunk = chunk.dropna(axis=0)
        chunk = chunk[np.where(
         (chunk[0].astype('str').str.len()>1) & 
         (chunk[1].astype('str').str.len()>1) &
         (chunk[4].astype('str').str.len()>4) &
         (chunk[4].astype('str').str.len()<8), True, False)]
        chunk[0] = ~chunk[0].str.contains("jr", na=False)
        chunk[1] = ~chunk[1].str.contains("jr", na=False)
        chunk.to_csv("/tmp/sample.csv", sep="|", header=None, index=False)
        connection = psycopg2.connect(connection details <here>)
        with connection.cursor() as cursor:
            connection.commit()

我正在处理的测试数据

jane|doe|1969-01-01|F|926.0|1351127|E2sboFz4Mk2aGIKhD4vm6J9Jt3ZSoSdLm+0PCdWsJto=|YSILMFS5sPPZZF/KFroEHV77z1bMeiL/f4FqF2kj4Xc=|tNjgnby5zDbfT2SLsCCwhNBxobSDcCp7ws0zYVme5w4=|kk25p0lrp2T54Z3B1HM3ZQN0RM63rjqvewrwW5VhYcI=|cigna_TOKEN_ENCRYPTION_KEY
jr|doe|1969-01-01|M|926.0|1351127|E2sboFz4Mk2aGIKhD4vm6J9Jt3ZSoSdLm+0PCdWsJto=|YSILMFS5sPPZZF/KFroEHV77z1bMeiL/f4FqF2kj4Xc=|tNjgnby5zDbfT2SLsCCwhNBxobSDcCp7ws0zYVme5w4=|kk25p0lrp2T54Z3B1HM3ZQN0RM63rjqvewrwW5VhYcI=|cigna_TOKEN_ENCRYPTION_KEY
jane|sr|1969-01-01|F|926.0|1351127|E2sboFz4Mk2aGIKhD4vm6J9Jt3ZSoSdLm+0PCdWsJto=|YSILMFS5sPPZZF/KFroEHV77z1bMeiL/f4FqF2kj4Xc=|tNjgnby5zDbfT2SLsCCwhNBxobSDcCp7ws0zYVme5w4=|kk25p0lrp2T54Z3B1HM3ZQN0RM63rjqvewrwW5VhYcI=|cigna_TOKEN_ENCRYPTION_KEY

我知道我在正确的方向上,但仍然错过了其他的东西,因为 当我尝试这个的时候

chunk[0] = ~chunk[0].str.contains("jr", na=False)

我得到以下输出:我希望删除整行,而不是False

True|True|1969-01-01|F|926.0|1351127|E2sboFz4Mk2aGIKhD4vm6J9Jt3ZSoSdLm+0PCdWsJto=|YSILMFS5sPPZZF/KFroEHV77z1bMeiL/f4FqF2kj4Xc=|tNjgnby5zDbfT2SLsCCwhNBxobSDcCp7ws0zYVme5w4=|kk25p0lrp2T54Z3B1HM3ZQN0RM63rjqvewrwW5VhYcI=|cigna_TOKEN_ENCRYPTION_KEY
False|True|1969-01-01|M|926.0|1351127|E2sboFz4Mk2aGIKhD4vm6J9Jt3ZSoSdLm+0PCdWsJto=|YSILMFS5sPPZZF/KFroEHV77z1bMeiL/f4FqF2kj4Xc=|tNjgnby5zDbfT2SLsCCwhNBxobSDcCp7ws0zYVme5w4=|kk25p0lrp2T54Z3B1HM3ZQN0RM63rjqvewrwW5VhYcI=|cigna_TOKEN_ENCRYPTION_KEY
True|True|1969-01-01|F|926.0|1351127|E2sboFz4Mk2aGIKhD4vm6J9Jt3ZSoSdLm+0PCdWsJto=|YSILMFS5sPPZZF/KFroEHV77z1bMeiL/f4FqF2kj4Xc=|tNjgnby5zDbfT2SLsCCwhNBxobSDcCp7ws0zYVme5w4=|kk25p0lrp2T54Z3B1HM3ZQN0RM63rjqvewrwW5VhYcI=|cigna_TOKEN_ENCRYPTION_KEY

预期产出:

jane|doe|1969-01-01|F|926.0|1351127|E2sboFz4Mk2aGIKhD4vm6J9Jt3ZSoSdLm+0PCdWsJto=|YSILMFS5sPPZZF/KFroEHV77z1bMeiL/f4FqF2kj4Xc=|tNjgnby5zDbfT2SLsCCwhNBxobSDcCp7ws0zYVme5w4=|kk25p0lrp2T54Z3B1HM3ZQN0RM63rjqvewrwW5VhYcI=|cigna_TOKEN_ENCRYPTION_KEY

我还有一个问题: 我可以尝试在str.contains中包含多个参数吗?要过滤更多条件,我尝试了以下两种方法,但都不起作用,它们都产生了正确/错误的结果

chunk[0] = ~chunk[0].str.contains("jr", “sr”, “|”, “||”, na=False)
chunk[1] = ~chunk[1].str.contains("jr", “sr”, “|”, “||”,  na=False)
or
searchfor = [‘jr’, ’sr’,’|’,’||’]
chunk[0] = ~chunk.chunk[0].str.contains('|'.join(searchfor))]
chunk[1] = ~chunk.chunk[1].str.contains('|'.join(searchfor))]

或者我应该使用drop方法删除行,任何建议或评论都将不胜感激,谢谢


Tags: keytokenfalseencryptioncontainschunkstrjr
1条回答
网友
1楼 · 发布于 2024-05-20 01:32:18

实际上,您忘记了将布尔序列(真/假)传递到括号[...]中,或者更好地使用.loc[...]。相反,您将这些块列中的值重新分配给条件的结果,但不将条件逻辑地应用于数据帧

因此,考虑调用这两个条件的交集{{CD3}}:

# ASSIGN BOOLEAN SERIES
fname_jr = ~chunk.loc[0].str.contains("jr", na=False)
lname_jr = ~chunk.loc[1].str.contains("jr", na=False)

# PASS INTO .loc
chunk_sub = chunk.loc[fname_jr & lname_jr]
chunk_sub

#       0    1   ...                                            9                          10
# 0  jane  doe  ...  kk25p0lrp2T54Z3B1HM3ZQN0RM63rjqvewrwW5VhYcI=  cigna_TOKEN_ENCRYPTION_KEY
# 2  jane   sr  ...  kk25p0lrp2T54Z3B1HM3ZQN0RM63rjqvewrwW5VhYcI=  cigna_TOKEN_ENCRYPTION_KEY

要集成多个选择,请调用str.join将项目列表与管道分隔符组合:

# ASSIGN BOOLEAN SERIES
fname_jr_sr = ~chunk[0].str.contains("|".join(["sr", "jr"]), na=False)
lname_jr_sr = ~chunk[1].str.contains("|".join(["sr", "jr"]), na=False)

# PASS INTO .loc
chunk_sub = chunk.loc[fname_jr_sr & lname_jr_sr]
chunk_sub
#       0    1   ...                                            9                          10
# 0  jane  doe  ...  kk25p0lrp2T54Z3B1HM3ZQN0RM63rjqvewrwW5VhYcI=  cigna_TOKEN_ENCRYPTION_KEY

与此相关,您的np.where调用是不必要的,因为.loc将在布尔级数上运行。由于管道符号是字符串匹配运算符,请确保也使用反斜杠转义|。总共:

chunk = chunk.loc[(chunk[0].astype('str').str.len()>1) & 
                  (chunk[1].astype('str').str.len()>1) &
                  (chunk[4].astype('str').str.len()>4) &
                  (chunk[4].astype('str').str.len()<8) & 
                  ~chunk[0].str.contains("|".join(["sr", "jr", "\\|", "\\|\\|"]), na=False) & 
                  ~chunk[1].str.contains("|".join(["sr", "jr", "\\|", "\\|\\|"]), na=False)]

chunk.to_csv("/tmp/sample.csv", sep="|", header=None, index=False)

相关问题 更多 >