2016-04-25 158 views
1

数据:使用df.apply和str.contains( '值',壳体=假)

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

我已经写的方法:

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

我称之为

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

并得到以下错误:

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

这是否允许应用?

它与这个成语:

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

有没有更好的办法?

+0

如何才能像SQL更新语句一样工作? – toasteez

回答

0

如果没有必要,我认为最好不要使用apply,因为显然它比较慢。

我认为你可以使用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 

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 

编辑:

看来你需要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 
+0

请检查解决方案,或许需要一些改进。 – jezrael

+0

@jezreail我试图更新列'B' UPDATE df SET B ='X' WHERE A ='Value'AND'C'!= 0 – toasteez