Hello stackoverflowers !!
我有以下数据框
import numpy as np
import pandas as pd
dataframe = pd.DataFrame({'column1': ['a', 'alike', 'b', 'x', 'a'],
'column2': ['a', 'b', 'c', 'unlake', 'like']})
column1 column2
0 a a
1 alike b
2 b c
3 x unlake
4 a like
我想创建另一个列,如果有以下任何字符串,则为1
check = ['like', 'lake', 'lik']
位于两列中的任何一列。
我从这开始:
any([check1 in dataframe['column1'][1] for check1 in check]) # for one value this works
然而,当我想为整个专栏做这件事时,我没有得到预期的结果
dataframe[['column1']].apply(lambda row: any((check1 in row for check1 in check)), axis = 1) # this works but does not give the expected
我可能错过了一些东西。
感谢您的帮助
答案 0 :(得分:1)
这可以给你你想要的东西
df['new_col'] = np.where(df.isin(check).any(axis=1),1,0) #this is for an exact match
展开以查看它是否包含任何项目
import numpy as np
import pandas as pd
df = pd.DataFrame({'column1': ['a', 'alike', 'b', 'x', 'a'],
'column2': ['a', 'b', 'c', 'unlake', 'like']})
check = ['like', 'lake', 'lik']
pattern = '|'.join(check)
mask = np.column_stack([df[col].str.contains(pattern, na=False) for col in df])
df['check'] = np.where(mask.any(axis=1),1,0)
答案 1 :(得分:1)
将np.logical_or与pd.Series.str.contains结合使用。这假设允许部分匹配。
import numpy as np
import pandas as pd
df = pd.DataFrame({'column1': ['a', 'alike', 'b', 'x', 'a'],
'column2': ['a', 'b', 'c', 'unlake', 'like']})
test_str = '|'.join({'like', 'lake', 'lik'})
df['Test'] = np.logical_or(df['column1'].str.contains(test_str),
df['column2'].str.contains(test_str))
# output
# column1 column2 Test
# a a False
# alike b True
# b c False
# x unlake True
# a like True
答案 2 :(得分:1)
您可以使用正则表达式“或”运算符|
将子字符串连接在一起,然后应用pd.Series.str.contains
方法,如下所示:
dataframe['substr_match'] = dataframe.apply(\
lambda col: col.str.contains('|'.join(check))).any(axis=1)
# column1 column2 substr_match
# 0 a a False
# 1 alike b True
# 2 b c False
# 3 x unlake True
# 4 a like True