2017-06-15 4 views
1

値がnullでない場合、各列のすべての要素にカスタム関数を適用する方法はありますか?パンダはすべての列のすべての要素に適用してマップします

私は、pd.notnull(x)の場合は4列のすべての要素にlower()関数を適用し、それ以外の場合は値として保持しないように10列のデータフレームがあるとします。

私は

s.apply(lambda x: change_to_lowercase(x), axis = 1) 

def change_to_lowercase(s): 

    s['A'] = s['A'].map(lambda x: x.lower() if pd.notnull(x) else x) 
    s['B'] = s['B'].map(lambda x: x.lower() if pd.notnull(x) else x) 
    s['C'] = s['C'].map(lambda x: x.lower() if pd.notnull(x) else x) 
    s['D'] = s['D'].map(lambda x: x.lower() if pd.notnull(x) else x) 
    return s 

、このように使用してみました。しかし、私の列は、(Unicodeとしてフロート、残りの部分としてNaNである)混合データ型であるため。これは私にエラーを投げています -

float has no attribute map. 

このエラーを取り除く方法はありますか?

答えて

0

あなたはSeriesをマップしようとしており、ラムダでは行全体をとっています。

また、.lower()メソッドを持たない整数や浮動小数点数などもチェックする必要があります。したがって、文字列かどうかをチェックするのは、私の意見ではnotnullではない場合だけではありません。

これは動作します:pythonの3のために

s = pd.DataFrame([{'A': 1.5, 'B':"Test", 'C': np.nan, 'D':2}]) 
s 

     A B C D 
0 1.5 Test NaN 2 



s1 = s.apply(lambda x: x[0].lower() if isinstance(x[0], basestring) else x[0]).copy() 

s1 
    A  1.5 
    B test 
    C  NaN 
    D  2 
    dtype: object 

を文字列isinstance(x[0], str)

場合は、列を選択することができるようにするにチェックするために:

s1 = pd.DataFrame() 
columns = ["A", "B"] 
for column in columns: 
    s1[column] = s[column].apply(lambda x: x.lower() if isinstance(x, str) else x).copy() 
s1 

    A B 
0 1.5 test 
+0

ありがとうございます。それは理にかなっている。これをデータフレームの一部の列に対してのみ適用するにはどうすればよいですか? –

+0

@ds_user updated answer –

1

私は、要素ごとに作業するので、あなたがDataFrame.applymapが必要だと思う:

L = [[1.5, 'Test', np.nan, 2], ['Test', np.nan, 2,'TEST'], ['Test', np.nan,1.5, 2]] 
df = pd.DataFrame(L, columns=list('abcd')) 
print (df) 

     a  b c  d 
0 1.5 Test NaN  2 
1 Test NaN 2.0 TEST 
2 Test NaN 1.5  2 

cols = ['a','b'] 
#for python 2 change str to basestring 
df[cols] = df[cols].applymap(lambda x: x.lower() if isinstance(x, str) else x) 
print (df) 
     a  b c  d 
0 1.5 test NaN  2 
1 test NaN 2.0 TEST 
2 test NaN 1.5  2 
関連する問題