2016-04-19 5 views
3
私は、データフレームのいくつかの値を置き換えるためのpythonでプログラムを書いている

、アイデアは、私はfile.txtと呼ばれるファイルを持っているということで、次のようになります。次のコードを最適化する方法は?

A:s:Y:0.1:0.1:0.1:0.2:0.1 
B:r:D:0.3:0.5:0.1:0.2:0.2 
C:f:C:0.3:0.4:0.2:-0.1:0.4 
D:f:C:0.1:0.2:0.1:0.1:0.1 
F:f:C:0.1:-0.1:-0.1:0.1:0.1 
G:f:C:0.0:-0.1:0.1:0.3:0.4 
H:M:D:0.1:0.4:0.1:0.0:0.4 

と私は、セパレータとして使用したいです「:::」、私はこのルールに従っていくつかの文字列のための4つの列の値を置き換えたい:範囲1にさんを所属

すべての値は「N」で交換しようとしている。

range1=[-0.2,-0.1,0,0.1,0.2] -> 'N' 

range2に属するすべての値は「L」のために交換することになるだろう:

range2=[-0.5,-0.4,-0.3] -> 'L' 

レンジ3に属するすべての値が「H」に置き換えることしようとしている。

range3=[0.3,0.4,0.5] 

これを達成するために、私は次のことを試してみました:

import pandas as pd 

df= pd.read_csv('file.txt', sep=':',header=None) 

labels=df[3] 


range1=[-0.2,-0.1,0,0.1,0.2] 

range2=[-0.5,-0.4,-0.3] 

range3=[0.3,0.4,0.5] 

lookup = {'N': range1, 'L': range2, 'H': range3} 




for k, v in lookup.items(): 
    df.loc[df[3].isin(v), 3] = k 


for k, v in lookup.items(): 
    df.loc[df[4].isin(v), 4] = k 


for k, v in lookup.items(): 
    df.loc[df[5].isin(v), 5] = k 

for k, v in lookup.items(): 
    df.loc[df[6].isin(v), 6] = k 

for k, v in lookup.items(): 
    df.loc[df[7].isin(v), 7] = k 


print(df) 

そして、それはうまく動作しますが、私は非常に多くのFORSの使用を避けたい、私はこれを達成する方法のいずれかの提案を感謝したいと思います。

答えて

4

あなたが代わりにwhereを使用することができます。

for k, v in lookup.items(): 
    df = df.where(~df.isin(v), k) 

をこれは、それらの値がvに含まれていないときdfの値を保持すると言います。それ以外の場合は、値をkに変更してください。割り当ては、各繰り返しでdfを上書きし、カテゴリラベルを累積します。

このメソッドは、1回の操作ですべての列に適用されるため、指定された数値の各インスタンスをそのカテゴリコード化された文字に置き換える場合にのみ機能します。

インプレース修正を指定する別のオプションがwhereですが、残念ながら、混在型のデータフレームでは使用できません。あなたの例では、カラム0,1、および2はタイプobject、残りはタイプfloatです。したがって、pandasは、同じタイプの列だけが実際に突然変異の影響を受けるかどうかをさらに調べるのではなく、すべてをobjectに変換して、インプレース上書きを行う必要があると控えめに(そして非効率的に)仮定します。TypeError例えば

、この:

df.where(~df.isin(v), k, inplace=True) 

TypeErrorが発生します。

このパンダの制限はかなりイライラです。

for k, v in lookup.items(): 
    df.where(~df.isin(v), inplace=True) 
    df[df.isnull()] = k # <-- same TypeError 

と驚くほどTruetry_castキーワード引数を設定し、および/またはへraise_on_errorキーワード引数を設定:以下も同じTypeErrorを与えるようたとえば、あなたも、どちらかそれを回避するために定期的なパンダの割り当てを使用することはできませんFalsewhereを使用しているときに、このタイプの安全性チェックを無効にできないように、TypeErrorが呼び出されるかどうかには影響しません。

+0

ありがとうございます。はい、私のデータフレームには混在した列型が含まれていますが、私が最初に提示したアプローチは非常に便利で、私が探していたものです。 – neo33

関連する問題