![](/img/trans.png)
[英]pandas dataframe check if column contains string that exists in another column
[英]Check if string is in another column pandas
下面是我的 DF
df= pd.DataFrame({'col1': ['[7]', '[30]', '[0]', '[7]'], 'col2': ['[0%, 7%]', '[30%]', '[30%, 7%]', '[7%]']})
col1 col2
[7] [0%, 7%]
[30] [30%]
[0] [30%, 7%]
[7] [7%]
目的是檢查 col1 值是否包含在下面的 col2 中是我嘗試過的
df['test'] = df.apply(lambda x: str(x.col1) in str(x.col2), axis=1)
以下是預期的輸出
col1 col2 col3
[7] [0%, 7%] True
[30] [30%] True
[0] [30%, 7%] False
[7] [7%] True
使用Series.str.extractall
獲取數字,通過Series.unstack
重塑,因此可以通過DataFrame.isin
與DataFrame.any
進行比較:
df['test'] = (df['col2'].str.extractall('(\d+)')[0].unstack()
.isin(df['col1'].str.strip('[]'))
.any(axis=1))
print (df)
col1 col2 test
0 [7] [0%, 7%] True
1 [30] [30%] True
2 [0] [30%, 7%] False
3 [7] [7%] True
您可以提取兩列和join
上的數字,然后使用eval
+ groupby
+ any
檢查每個 id 是否至少有一個匹配項:
(df['col2'].str.extractall('(?P<col2>\d+)').droplevel(1)
.join(df['col1'].str[1:-1])
.eval('col2 == col1')
.groupby(level=0).any()
)
輸出:
0 True
1 True
2 False
3 True
一種方法:
import ast
# convert to integer list
col2_lst = df["col2"].str.replace("%", "").apply(ast.literal_eval)
# check list containment
df["col3"] = [all(bi in a for bi in b) for a, b in zip(col2_lst, df["col1"].apply( ast.literal_eval)) ]
print(df)
輸出
col1 col2 col3
0 [7] [0%, 7%] True
1 [30] [30%] True
2 [0] [30%, 7%] False
3 [7] [7%] True
您還可以用單詞邊界\\b
替換方括號並使用re.search
像
import re
#...
df.apply(lambda x: bool(re.search(x['col1'].replace("[",r"\b").replace("]",r"\b"), x['col2'])), axis=1)
# => 0 True
# 1 True
# 2 False
# 3 True
# dtype: bool
這會起作用,因為\\b7\\b
會在[0%, 7%]
找到匹配項,因為7
既不前面也不后面跟字母、數字或下划線。 在[30%, 7%]
中找不到任何匹配項,因為\\b0\\b
不匹配數字后的零(此處為3
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.