2016-10-19 12 views
2

2つの列の値の組み合わせが有効な場合は、列の値を置換したいと考えています。 DataFrameセルの値を変更するデータフレームの組み合わせを検索

df = pd.DataFrame([ 
     ['Texas 1', '111', '222', '333'], 
     ['Texas 1', '444', '555', '666'], 
     ['Texas 2', '777','888','999'] 
    ]) 

     0 1 2 3 
0 Texas 1 111 222 333 
1 Texas 1 444 555 666 
2 Texas 2 777 888 999 

次と私は考えてみましょう私はcolumn 2 = 222私がやっているのcolumn 2column 0 = Texas 1場合と値で値を置き換えたい場合は、次のために正常に動作します

df.ix[ (df.Column 0=='Texas 1')&(df.Column 2 =='222'),Column 2] = "Success" 

いくつかの組み合わせ。私が迷っている部分は、300種類以上の組み合わせでこれを行う方法です。私はdictを使用し、キーを保存すると思ったかもしれません。それは'Success'またはそれ以外の値です。リストはその組み合わせかもしれない。このようなもの。

a["Success"] = [Texas 1, 222] 
>>> a 
{"Success": [Texas 1, 222]} 

しかし、私はDataFrameでそれを行う方法がわかりません。

答えて

1

ほとんどすべてのコードがあります。dictionaryまたはlistを作成し、それを繰り返し実行するだけです。

import pandas as pd 
combinations = [['key1', 'key2', 'msg']] 
combinations.append(['Texas 1', '222', 'triple two']) 
combinations.append(['Texas 1', '555', 'triple five']) 

df = pd.DataFrame([ 
     ['Texas 1', '111', '222', '333'], 
     ['Texas 1', '444', '555', '666'], 
     ['Texas 2', '777','888','999'] 
    ]) 

for c in combinations: 
    df.ix[(df[0] == c[0]) & (df[2] == c[1]), 1] = c[2] 

出力:DataFrame.apply()ため

  0   1 2 3 
0 Texas 1 triple two 222 333 
1 Texas 1 triple five 555 666 
2 Texas 2   777 888 999 
+0

これは私が探していたものを正確に教えてくれました。この特定の例に対して辞書またはリストを使用することの違いは何ですか? – rubito

+1

この特定の例では実際には関係ありません。辞書はより便利ですが遅くなり、順序は保持されませんが、リストは高速で順序は保持されます。セマンティクスに関しては、ここで辞書を使用することは実際には意味がありません。 2つの異なる値のペアで同じ結果が得られる場合はどうなりますか?鍵は何ですか、価値は何ですか? –

0

グレートユースケース。ラムダはずっと機能しています!!

df = pd.DataFrame([ 
     ['Texas 1', 111, 222, 333], 
     ['Texas 1', 444, 555, 666], 
     ['Texas 2', 777,888,999] 
    ]) 


val_dict = {} 
# assumption 
# str_like_Success : [column_0 , column_1] 
val_dict["Success"] = ['Texas 1', 222] 
val_dict["Failure"] = ['Texas 2', 888] 

fill_values_from_dictx行(シリーズ)であり、val_dict

def fill_values_from_dict(x,val_dict): 
     for key,val in val_dict.items(): 
      if x[0] == val[0] and x[2] == val[1]: 
       x.set_value(1,key) 
       return x 
     return x 

上記で作成した辞書はfill_values_from_dict

df1 = df.apply(lambda x : fill_values_from_dict(x,val_dict),axis=1) 

各列に適用され、各列に適用される関数

出力:

print(df1) 

      0  1 2 3 
    0 Texas 1 Success 222 333 
    1 Texas 1  444 555 666 
    2 Texas 2 Failure 888 999 
関連する問題