检查是否至少一列包含熊猫中的字符串

时间:2021-05-24 15:53:01

标签: python pandas

我想检查几列是否包含一个字符串,并用结果生成一个布尔列。这对于单列很容易做到,但是当将此方法应用于多列时会生成属性错误 (AttributeError: 'DataFrame' object has no attribute 'str')。

示例:

import pandas as pd

c1=[x+'x' for x in 'abcabc']
c2=['Y'+x+'m' for x in 'CABABC']
cols=['A','B']

df=pd.DataFrame(list(zip(c1,c2)),columns=cols)
df

返回:

    A   B
0   ax  YCm
1   bx  YAm
2   cx  YBm
3   ax  YAm
4   bx  YBm
5   cx  YCm

以下代码在应用于单个列时有效,但在应用于多个列时不起作用。我想要一些适合这里并提供所需结果的东西:

df['C']=df[cols].str.contains('c',case=False)

因此所需的输出是:

    A   B   C
0   ax  YCm True
1   bx  YAm False
2   cx  YBm True
3   ax  YAm False
4   bx  YBm False
5   cx  YCm True

编辑:我更新了我的示例以反映实际搜索列是否“包含”一个值,而不是“等于”该值的愿望。

编辑:就时间而言,这是我希望能够匹配或击败的基准,而无需创建新列(在我的玩具示例中对列使用 *1000):

newcols=['temp_'+x for x in cols]

for col in cols:
    df['temp_'+col]=df[col].str.contains('c',case=False)

df['C']=df[newcols].any(axis=1)
df=df[['A','B','C']]

2 个答案:

答案 0 :(得分:4)

通过 applymap 的选项:

df['C'] = df.applymap(lambda x: 'c' in str(x).lower()).any(1)

通过stack/unstack

df['C'] = df.stack().str.contains('c', case=False).unstack().any(1)
df['C'] = df.stack().str.lower().str.contains('c').unstack().any(1)

输出:

    A    B      C
0  ax  YCm   True
1  bx  YAm  False
2  cx  YBm   True
3  ax  YAm  False
4  bx  YBm  False
5  cx  YCm   True

答案 1 :(得分:1)

我会跨列运行应用程序并获取其中的 any()

df['C']=df.apply(lambda y: y.str.contains('c',case=False),1).any(1)