简体   繁体   English

使用 df.apply 和 str.contains('value', case =False)

[英]using df.apply and str.contains('value', case =False)

Data:数据:

A     |    B   |    C    
========================
Value | Fred   |    0
foo   | Jim    |    1
Value | Bob    |    2

I have written a method:我写了一个方法:

def is_value(df):
    if df['A'].str.contains('value', case=False):
        b='X'
        return b

I call it with:我称之为:

df['B'] = df.apply(is_value, axis=1)

and get the following error:并得到以下错误:

AttributeError: ("'str' object has no attribute 'str'", 'occurred at index 0')

Is this allowed in apply?这在应用中允许吗?

It works with this idiom:它适用于这个习语:

df = df.loc[df['A'].str.contains('Value', case=False) & df['C'] !=0]
df['A'] = 'X'

Is there a better way?有没有更好的办法?

I think the best is not use apply if it is not necessary, because obviously it is slower.如果没有必要,我认为最好不要使用apply ,因为显然它更慢。

I think you can use mask :我认为你可以使用mask

print df['A'].str.contains('value', case=False)
0     True
1    False
2     True
Name: A, dtype: bool

df['B'] = df.mask(df['A'].str.contains('value', case=False), 'X')
print df
       A    B  C
0  Value    X  0
1    foo  Jim  1
2  Value    X  2

Another solution with loc : loc另一个解决方案:

df.loc[ df['A'].str.contains('value', case=False), 'B'] = 'X'
print df
       A    B  C
0  Value    X  0
1    foo  Jim  1
2  Value    X  2

EDIT:编辑:

It seems you need add filtering values not equal 0 in column C :看来您需要在C列中添加不等于0过滤值:

print (df['A'].str.contains('value', case=False)) & (df['C'] !=0)
0    False
1    False
2     True
dtype: bool

df['B'] = df.mask((df['A'].str.contains('value', case=False)) & (df['C'] !=0), 'X')
print df
       A      B  C
0  Value  Value  0
1    foo    foo  1
2  Value      X  2


df.loc[(df['A'].str.contains('value', case=False)) & (df['C'] !=0) , 'B'] = 'X'
print df
       A      B  C
0  Value  Value  0
1    foo    foo  1
2  Value      X  2

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM