[英]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.