2016-10-23 11 views
0

これは私の試みです。パンダの特定の文字列を使ったマッピング関数

今私が持っているデータフレームには、どのように機能を扱うかを決定する列があります。

たとえば、dfは、2つの列、DATAおよびTYPEを持っています。 TYPEは、S1,S2およびS3の3つのクラスを有する。そして私は、異なるタイプのサンプルに基づいて3つの異なる機能を定義します。

#### S1 
def f_s1(data): 
    result = data+1 
    return result 

#### S2 
def f_s2(data): 
    result = data+2 
    return result 

#### S3 
def f_s3(data): 
    result = data+3 
    return result 

Iはまた、マッピングセット作成:次に

f_map= {'S1':f_s1,'S2':f_s2, 'S3': f_s3} 

を、私は、各試料の種類と、これらの機能をマップするpandas.Mapユーティリティを使用します。

df['result'] = df['TYPE'].map(f_map)(df['DATA']) 

しかし、TypeError: 'Series' object is not callableでは機能しませんでした。

アドバイスをお願いします。

答えて

1

df['TYPE'].map(f_map)は、一連の機能を作成し、あなたがそれに応じてデータ列に適用したい場合は、1つのオプションは、次のようにzip()機能を使用することです:

また
df['result'] = [func(data) for func, data in zip(df['TYPE'].map(f_map), df['DATA'])] 
df 

enter image description here

、あなたをグループ番号TYPEでグループ化し、そのグループ内のDATA列に各タイプ(またはグループ)の特定の関数を適用できます。事前定義された関数にはベクトル演算が含まれているため、系列をパラメータとして受け入れるものとします。

df = pd.DataFrame({'TYPE':['S1', 'S2', 'S3', 'S1'], 'DATA':[1, 1, 1, 1]}) 

df['result'] = (df.groupby('TYPE').apply(lambda g: f_map.get(g['TYPE'].iloc[0])(g['DATA'])) 
        .reset_index(level = 0, drop = True)) 

enter image description here

関連する問題