2017-08-11 6 views
0

ルックアップ辞書のコスト値を検索するために使用するPandasデータフレームに列があります。ルックアップ辞書を使用して列の値を更新するパンダ

アイデアは、アイテムがある場合は既存のカラムを更新し、そうでない場合はカラムを空白にします。

これまでに見てきたメソッドとソリューションは、メソッドの適用や割り当てなど新しい列を作成するようですが、既存のデータを保持することが重要です。果実の列の項目を検索された私は何を達成したい

lookupDict = {'Apple': 1, 'Orange': 2,'Kiwi': 3,'Lemon': 8} 

df1 = pd.DataFrame({'Fruits':['Apple','Banana','Kiwi','Cheese'], 
       'Pieces':[6, 3, 5, 7], 
       'Cost':[88, 55, 65, 55]},) 

と項目がある場合、私は数を乗じた辞書値とコスト列を更新する:ここで

は私のコードです個数

たとえば、アップルの場合、ルックアップ辞書からのコストは1であり、データフレームの数は6であるため、コスト列は88から(6 * 1)= 6に更新されます。ルックアップ辞書にないバナナであるため、元のデータフレームのコストは変更されません。同じロジックが残りのアイテムに適用されます。

これを実現するには、リストをデータフレームから分離し、それらを繰り返して、データフレームにデータフレームに追加するだけです。別のリストを使用せずにデータフレームの値に作用することが可能かどうか、私は疑問に思っていますか?他の回答から

I画像Iは、次のようなLOC指標を使用する必要があります(しかし、これは動作していないと私は新しい列を作成する必要はありません)

df1.loc[df1.Fruits in lookupDict,'Cost'] = lookupDict[df1.Fruits] * lookupD[df1.Pieces] 

私も試してみましたマップが、それは既存の列のすべての内容を上書きします

df1['Cost'] = df1['Fruits'].map(lookupDict)*df1['Pieces'] 

EDIT *******

私はしかし、以下の反復を使用してそれを達成することができました

#Iteration method 

for i,x in zip(df1['Fruits'],xrange(len(df1.index))): 
     fruit = (df1.loc[x,'Fruits']) 
     if fruit in lookupDict: 
      newCost = lookupDict[fruit] * df1.loc[x,'Pieces'] 
      print(newCost) 
      df1.loc[x,'Cost'] = newCost 

答えて

1

IIUC:

mask = df1['Fruits'].isin(lookupDict.keys()) 
df1.loc[mask, 'Cost'] = df1.loc[mask, 'Fruits'].map(lookupDict) * df1.loc[mask, 'Pieces'] 

Result: 

In [29]: df1 
Out[29]: 
    Cost Fruits Pieces 
0  6 Apple  6 
1 55 Banana  3 
2 15 Kiwi  5 
3 55 Cheese  7 
これを達成するためのクリーンな方法があれば、まだ好奇心
関連する問題