1

这是具有 A 列的一个 Dataframe A

| A |
:---:
|abc|
|xyz|
|bnm|

这是另一个带有 B 列的数据框 B

| B  |
:----:
|ABc |
|ghj |
|X_yz|
|B+NM|

Dataframe B 的期望输出应该是非 Dataframe

| B |  
:---:
|abc|
|xyz|
|bnm|

| non |
:-----:
| ghj |


regex = r"[a-zA-Z]"
if sorted(re.split(regex, A["A"], re.MULTILINE | re.IGNORECASE)) == sorted(re.split(regex, B["B"], re.MULTILINE | re.IGNORECASE)):
  B["B"] = B["B"].replace(A["A"])
else:
  non.append(B["B"])

我无法得到它是错误的。请帮助我使用此代码

4

1 回答 1

1

pandas可以通过str 访问器实现常见的字符串清理。您可以立即链接清理步骤,然后 (1) 执行内部连接或 (2) 使用.isin()来选择所需的行。这两种用法都是出于演示目的而显示的,.isin()语法更简洁。

数据

import pandas as pd
import io

A = pd.read_csv(io.StringIO("""
A
abc
xyz
bnm
"""), sep=r"\s{2,}", engine='python')

B = pd.read_csv(io.StringIO("""
B
ABc
ghj
X_yz
B+NM
"""), sep=r"\s{2,}", engine='python')

解决方案

B["B"] = B["B"].str.replace(r"[^A-Za-z]", "", regex=True)\
               .str.lower()\
               .str.strip()  # if there is trailing spaces

# method 1: join
B_matched = B.merge(A, how="inner", left_on="B", right_on="A")[["B"]]
# method 2: isin
B_non = B[~B["B"].isin(B_matched["B"])].rename(columns={"B": "non"})

输出

print(B_matched)
     B
0  abc
1  xyz
2  bnm

print(B_non)
   non
1  ghj
于 2021-04-07T09:13:00.603 回答