簡體   English   中英

檢查字符串是否在另一列熊貓中

[英]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.isinDataFrame.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM