python pandas 列以另外两个列值为条件
python pandas column conditional on two other column values
python pandas 中是否有一种方法可以在某一列或另一列具有值时应用条件?
对于一列,我知道我可以使用以下代码,如果列标题包含单词 "test" 则应用测试标志。
df['Test_Flag'] = np.where(df['Title'].str.contains("test|Test"), 'Y', '')
但是如果我想说列标题或列副标题是否包含单词"test",请添加测试标志,我该怎么做?
这显然行不通
df['Test_Flag'] = np.where(df['Title'|'Subtitle'].str.contains("test|Test"), 'Y', '')
如果有很多列,那么更简单的方法是创建子集 df[['Title', 'Subtitle']]
和 apply
contains
, because works only with Series
and check at least one True
per row by any
:
mask = df[['Title', 'Subtitle']].apply(lambda x: x.str.contains("test|Test")).any(axis=1)
df['Test_Flag'] = np.where(mask,'Y', '')
样本:
df = pd.DataFrame({'Title':['test','Test','e', 'a'], 'Subtitle':['b','a','Test', 'a']})
mask = df[['Title', 'Subtitle']].apply(lambda x: x.str.contains("test|Test")).any(axis=1)
df['Test_Flag'] = np.where(mask,'Y', '')
print (df)
Subtitle Title Test_Flag
0 b test Y
1 a Test Y
2 Test e Y
3 a a
pattern = "test|Test"
match = df['Title'].str.contains(pattern) | df['Subtitle'].str.contains(pattern)
df['Test_Flag'] = np.where(match, 'Y', '')
使用@jezrael 的设置
df = pd.DataFrame(
{'Title':['test','Test','e', 'a'],
'Subtitle':['b','a','Test', 'a']})
pandas
你可以 stack
+ str.contains
+ unstack
import re
df.stack().str.contains('test', flags=re.IGNORECASE).unstack()
Subtitle Title
0 False True
1 False True
2 True False
3 False False
将所有内容与
结合起来
truth_map = {True: 'Y', False: ''}
truth_flag = df.stack().str.contains(
'test', flags=re.IGNORECASE).unstack().any(1).map(truth_map)
df.assign(Test_flag=truth_flag)
Subtitle Title Test_flag
0 b test Y
1 a Test Y
2 Test e Y
3 a a
numpy
如果性能是一个问题
v = df.values.astype(str)
low = np.core.defchararray.lower(v)
flg = np.core.defchararray.find(low, 'test') >= 0
ys = np.where(flg.any(1), 'Y', '')
df.assign(Test_flag=ys)
Subtitle Title Test_flag
0 b test Y
1 a Test Y
2 Test e Y
3 a a
天真的时间测试
python pandas 中是否有一种方法可以在某一列或另一列具有值时应用条件?
对于一列,我知道我可以使用以下代码,如果列标题包含单词 "test" 则应用测试标志。
df['Test_Flag'] = np.where(df['Title'].str.contains("test|Test"), 'Y', '')
但是如果我想说列标题或列副标题是否包含单词"test",请添加测试标志,我该怎么做?
这显然行不通
df['Test_Flag'] = np.where(df['Title'|'Subtitle'].str.contains("test|Test"), 'Y', '')
如果有很多列,那么更简单的方法是创建子集 df[['Title', 'Subtitle']]
和 apply
contains
, because works only with Series
and check at least one True
per row by any
:
mask = df[['Title', 'Subtitle']].apply(lambda x: x.str.contains("test|Test")).any(axis=1)
df['Test_Flag'] = np.where(mask,'Y', '')
样本:
df = pd.DataFrame({'Title':['test','Test','e', 'a'], 'Subtitle':['b','a','Test', 'a']})
mask = df[['Title', 'Subtitle']].apply(lambda x: x.str.contains("test|Test")).any(axis=1)
df['Test_Flag'] = np.where(mask,'Y', '')
print (df)
Subtitle Title Test_Flag
0 b test Y
1 a Test Y
2 Test e Y
3 a a
pattern = "test|Test"
match = df['Title'].str.contains(pattern) | df['Subtitle'].str.contains(pattern)
df['Test_Flag'] = np.where(match, 'Y', '')
使用@jezrael 的设置
df = pd.DataFrame(
{'Title':['test','Test','e', 'a'],
'Subtitle':['b','a','Test', 'a']})
pandas
你可以 stack
+ str.contains
+ unstack
import re
df.stack().str.contains('test', flags=re.IGNORECASE).unstack()
Subtitle Title
0 False True
1 False True
2 True False
3 False False
将所有内容与
结合起来truth_map = {True: 'Y', False: ''}
truth_flag = df.stack().str.contains(
'test', flags=re.IGNORECASE).unstack().any(1).map(truth_map)
df.assign(Test_flag=truth_flag)
Subtitle Title Test_flag
0 b test Y
1 a Test Y
2 Test e Y
3 a a
numpy
如果性能是一个问题
v = df.values.astype(str)
low = np.core.defchararray.lower(v)
flg = np.core.defchararray.find(low, 'test') >= 0
ys = np.where(flg.any(1), 'Y', '')
df.assign(Test_flag=ys)
Subtitle Title Test_flag
0 b test Y
1 a Test Y
2 Test e Y
3 a a
天真的时间测试