我有一个名为df
的DataFrame,我想知道df
是否在每一行中都包含元素a
。
import pandas as pd
import numpy as np
df=pd.DataFrame({'id':[1,2,3],'item1':['a','c','a'],
'item2':['b','d','e'],'item3':['c','e',np.nan]})
Input:
id item1 item2 item3
0 1 a b c
1 2 c d e
2 3 a e NaN
在新列contain_a
中,1
代表列item1
或item2
或item3
包含元素a
的列。
Expected:
id item1 item2 item3 contains_a
0 1 a b c 1
1 2 c d e 0
2 3 a e NaN 1
答案 0 :(得分:2)
使用
In [578]: df['contains_a'] = df.filter(like='item').eq('a').any(1).astype(int)
In [579]: df
Out[579]:
id item1 item2 item3 contains_a
0 1 a b c 1
1 2 c d e 0
2 3 a e NaN 1
答案 1 :(得分:1)
使用字符串访问器检查第1列(id
)中除df.iloc[:, 1:]
之外的每列,以查看其是否包含字母a
,然后在各行中使用any
(axis=1
)。将布尔结果转换为整数(1或0)。
>>> df.assign(contains_a=df.iloc[:, 1:].apply(lambda s: s.str.contains('a')).any(axis=1).astype(int))
id item1 item2 item3 contains_a
0 1 a b c 1
1 2 c d e 0
2 3 a e NaN 1
对于多个目标也太笼统了:
targets = ['aa', 'a', 'b', 'c']
d = {'contains_{}'.format(target):
df.iloc[:, 1:].apply(lambda s: s.str.contains(target)).any(axis=1).astype(int)
for target in targets}
>>> df.assign(**d)
id item1 item2 item3 contains_a contains_aa contains_b contains_c
0 1 a b c 1 0 1 1
1 2 c d e 0 0 0 1
2 3 a e NaN 1 0 0 0