根据列表替换值,但将替换值保留在单独的列中

时间:2020-06-05 17:34:06

标签: python pandas

我有一个类似以下的df

ES1!

如果列在列表中,我想将部分字符串替换为“”,还要将它们保留在单独的列中。说我的清单为例;

ColumnA
"ABC X1"
"BCS X2"
"CCC X3"

所以我想要的输出是

["X1","X3"]

我知道如何使用ColumnA ColumnB "ABC" "X1" "BCS X2" "CCC" "X3" 替换值,而且我还认为我可以通过使用for循环并将每个值与列表中的值进行比较,并保持它们是否匹配来解决问题,但是也许有更好的解决方案吗?

7 个答案:

答案 0 :(得分:4)

您可以做两次:

  ColumnA ColumnB
0    ABC       X1
1  BCS X2     NaN
2    CCC       X3

输出:

{{1}}

答案 1 :(得分:2)

lst = ["X1","X3"]
df = pd.DataFrame({'ColumnA': ["ABC X1", "BCS X2", "CCC X3"]})

import re

r = re.compile('|'.join(r'(\b{}\b)'.format(re.escape(v)) for v in lst))

df = df.ColumnA.apply(lambda x: pd.Series([v.strip() for v in r.split(x) if v])) \
               .rename(columns={0:'ColumnA', 1:'ColumnB'}) \
               .fillna('')

print(df)

打印:

  ColumnA ColumnB
0     ABC      X1
1  BCS X2        
2     CCC      X3

答案 2 :(得分:2)

使用splitisin的替代方法:

l = ["X1","X3"]

s = df.pop("ColumnA").str.strip('"')
df[['ColumnA','ColumnB']] = s.str.split(expand=True).where(lambda x: x[1].isin(l))
df['ColumnA'] = df['ColumnA'].fillna(s)

print(df)

  ColumnA ColumnB
0     ABC      X1
1  BCS X2     NaN
2     CCC      X3

答案 3 :(得分:1)

如果列表的任何元素后跟str.split,则可以在空格前使用(?=,并使用正向超前正则表达式l = ["X1","X3"] c = '|'.join(l) df_ = (df['ColumnA'].str.split(f' (?={c})', expand=True) .rename(columns={0:'ColumnA', 1:'ColumnB'}) .fillna('')) print (df_) ColumnA ColumnB 0 ABC X1 1 BCS X2 2 CCC X3

df['ColumnB'] = df.ColumnA.str.extract(f'({"|".join(strs)})')[0]
df['ColumnA'] =df.ColumnA.replace(strs,'', regex=True)

答案 4 :(得分:1)

尝试一下:

def match(_):
    for m in match_lst:
        if m in _:
            return ','.join(_.split())
    return f"{_},"

df = df['ColumnA'].apply(match).str.split(',', 1, expand=True)
df.columns = ['ColumnA', 'ColumnB']

答案 5 :(得分:1)

首先让我们找到需要修改的行:

df = pd.DataFrame({'ColumnA': ["ABC X1", "BCS X2", "CCC X3"]})
values = ["X1","X3"]

columns_to_modify = df['ColumnA'].str.contains('|'.join(values))

然后我们创建一个带有空字符串的ColumnB:

df['ColumnB'] = ''

并将仅需要修改的行拆分到新列上:

df[columns_to_modify] = df['ColumnA'].str.split(expand=True)[columns_to_modify]

输出:

  ColumnA ColumnB
0     ABC      X1
1  BCS X2        
2     CCC      X3

答案 6 :(得分:0)

这是一种解决方法:

remDr$navigate("https://maps.gsi.go.jp")
webElem <- remDr$findElement(using = "xpath","//input[@id='query']")
webElem$clickElement()
webElem$sendKeysToElement(list("茨城県行方郡玉造町", key = "enter"))

webElem2 <- remDr$findElement(using = "xpath","//div[@class='searchresultdialog_ul_frame']//a")
webElem2$clickElement()

使用Pandas字符串函数的较短语法