2017-06-11 3 views
1

こんにちはpython/pandasコミュニティ。 「world_rank」列を浮動小数点数に変換しようとしてから、kaggle.comからこのコードをコピーしました。コードは魔法のように機能しましたが、わかりません。パンダ列のラムダ解読

ラムダのコードを私に説明してください。

# convert university world rank columns to float (where necessary) 
f = lambda x: int((int(x.split('-')[0]) + int(x.split('-')[1]))/2) if len(str(x).strip()) > 3 else 
df_ranks['world_rank'] = df_ranks['world_rank'].str.replace('=','').map(
    f).astype('float') 

答えて

2

他にコードが存在しないことは確実ですか?

一行のラムダコード基本的に、これは言う:

#for every element in series df['world_rank'] 
def foo(x): 
    #if x actually contains 4 or more character(except whitespaces in front and end), i.e len > 3 
    if len(str(x).strip()) > 3: 
     #then do this with that element 'x' and return 
     return int((int(x.split('-')[0]) + int(x.split('-')[1]))/2) 
    #else if len < 4 
    else: 
     #do something else 
     return 

ここで、私はあなたが基本的な文字列とリストインデックス操作を認識していると仮定しています。

+0

考えてみましょうあなたのGupta氏に感謝します。あなたの説明で、私が以前理解できなかったことのほとんどを理解します。 最後に私は理解していないことがあります。最後に、str.replace( '='、 '')。map(f)と書かれています。 –

+0

それはworld_rank列に関数 'f'を適用していることを意味しますか? –

+0

.str.replace( "="、 "")は、Series df_ranks ['world_rank']の各要素に適用される文字列操作です。これはa_string_variable.replace( "="、 "")と似ていますが、これは一連の文字列ではなく、単一の文字列に対してのみ機能します。したがって、 ".str"を追加すると、pandasシリーズにあるすべての文字列要素に作用させることができます。 ".map(f)"は元のdf_rank ['world_rank'] Seriesの各要素に対して "replace"演算を行った後に得られた系列のすべての要素にその関数 "f"を適用することを意味します。希望が役立ちます。答えを受け入れてくれてありがとう。 –

2

私は実際にはこれが悪いコードだと考えるので、すべての要素の内訳を避けています。

コードの目的は、40-50のような文字列を分割し、平均を4050に戻すことです。 40のような数字もそれだけで処理されます。私はそれをどうやって行うのか2つのバリエーションを与えます。

は、データフレームdf

df = pd.DataFrame(dict(world_rank=['20-30', 40, '50', '60-63'])) 

df 

    world_rank 
0  20-30 
1   40 
2   50 
3  60-63 

pandas.Series.str

df.assign(
    world_rank=pd.DataFrame(
     df.world_rank.astype(str).str.strip().str.split('-').tolist() 
    ).astype(float).mean(1).astype(int) 
) 

    world_rank 
0   25 
1   40 
2   50 
3   61 

numpy

v = df.world_rank.values.astype(str) 
a = np.core.defchararray.split(v, '-').tolist() 
df.assign(world_rank=pd.DataFrame(a).astype(float).mean(1).astype(int)) 

    world_rank 
0   25 
1   40 
2   50 
3   61 
+0

あなたの助けてくれてありがとうpiRSquared、素敵なシャツ:)私は自宅のコンピュータで自分のコードを試してみて、それがうまくいくかどうかを理解することができるかどうかを調べるために少しずつ分解します。間違いなく畳み込まれておらず、読みやすくなっています。あなたのコードでこれまでに知らなかった新しい要素が2つあります。私に教えてくれてありがとう。 –