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

、アイデアは、私はfile.txtと呼ばれるファイルを持っているということで、次のようになります。データフレームの一部の文字列を置き換えるプログラムを作成するにはどうすればよいですか?

A:::s:::te-sd:::0.3 
B:::s:::te-sd:::0.2 
C:::s:::fd-df:::0.1 
W:::h:::fd-df:::0.1 

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

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

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

range2に属するすべての値は、 oが「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] 

for label in labels: 
    if((label in range1) == True): 
     label = 'N' 

    if((label in range2) == True): 
     label = 'L' 

    if((label in range2) == True): 
     label = 'H' 

print(labels) 

しかし、私がラベルを印刷したときに変更があった場合は、どのように修正するかについてのご意見をお聞かせください。

+0

現在、実際のデータフレームではなく、変数「ラベル」の定義を変更しています。 –

答えて

1

はそれを見て、isin機能と、辞書から交換してください。このようなもの...

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

>>> lookup 
{'H': [0.3, 0.4, 0.5], 'L': [-0.5, -0.4, -0.3], 'N': [-0.2, -0.1, 0, 0.1, 0.2]} 

>>> df 
    0 1  2 3 
0 A s te-sd 0.3 
1 B s te-sd 0.2 
2 C s fd-df 0.1 
3 W h fd-df 0.1 


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


>>> df 
    0 1  2 3 
0 A s te-sd H 
1 B s te-sd N 
2 C s fd-df N 
3 W h fd-df N 
+0

ありがとう、これは非常に便利でした、私は本当にあなたの助けを感謝します。 – neo33

0

for label in labels:は毎回新しい変数labelを作成し、値を割り当てます。その値を変更しても、要素には何の影響もありません。これを試してください:

for i in xrange(len(labels)): 
    if label[i] in range1: 
     label[i] = 'N' 

    elif label[i] in range2: 
     label = 'L' 

    elif label[i] in range3: # You had a bug here -> it was range2 
     label = 'H' 

print labels 
0

返される値は文字列です。あなたはそれらを浮動小数点に変換する必要があります(または、範囲の値を文字列に変更する必要があります)。

label_vals = [float(x[-1]) for x in df[3].str.split(':::')] 

はまた:

def mapping(val): 
    if -.2 <= val <= .2: 
     return 'N' 
    if .3 <= val <= .5: 
     return 'H' 
    if -.5 <= val <= -.3: 
     return 'L' 

new_labels = [':::'.join(x[:-1] + [mapping(float(x[-1]))]) 
       for x in df[3].str.split(':::')] 

>>> new_labels 
['A:::s:::te-sd:::H', 
'B:::s:::te-sd:::N', 
'C:::s:::fd-df:::N', 
'W:::h:::fd-df:::N'] 
+0

これは良いですが、私がコードを実行すると、取得できます:pandasでnp.object_dtypeを使用する文字列値を持つ.strアクセサのみを使用できます。この問題は、.strを使用しているという事実と関連していると思いますデータフレーム。 – neo33

関連する問題