2013-04-22 14 views
9

私は数年にわたるデータフレームを持っており、ある時点で彼らは民族性のコードを変更しました。したがって、同じデータフレーム内の別の列である、年に条件付き値を再コード化する必要があります。例1 3 4など、2〜3、3の場合:パンダの条件付き置換

old = [1, 2, 3, 4, 5, 91] 
new = [3, 3, 4, 2, 1, 6] 

、これは、同じ列(民族性)で年間、他の年1996 2001までの値を行われなければなりません変更しないでください。あまりにも多くの非効率的なループを回避することを望んで、私は試みました:しかし、データフレームの元の値は変更されませんでした。 replaceメソッド自体は新しい値を正しく置き換えて返しましたが、inplaceオプションは条件を適用するときに元のデータフレームに影響しないようです。これは経験豊かなパンダのユーザーには明らかですが、確かにすべてのsingel要素をループするのではなく、これを行う簡単な方法が必要ですか?

編集(×2):彼女はまた、(と「:配列が安全に必要な型にキャストすることはできません例外TypeError」「代替品の長さは、一連の長さと等しくなければなりません」):動作しませんでした別のアプローチの一例である

oldNewMap = {1:2, 2:3} 
df2 = DataFrame({"year":[2000,2000,2000,2001,2001,2001],"ethnicity":[1,2,1,2,3,1]}) 
df2['ethnicity'][df2.year==2000] = df2['ethnicity'][df2.year==2000].map(oldNewMap) 

編集:他のコンピュータで正常に動作するため、インストール/バージョン固有の問題があるようです。

答えて

10

ちょうどそれを別の方法を行うために単純なことがあります

oldNewMap = {1: 3, 2: 3, 3: 4, 4: 2, 5: 1, 91: 6} 
df['ethnicity'][df.year==year] = df['ethnicity'][df.year==year].map(oldNewMap) 
+0

ありがとうございました!私はこれと似たようなことを試みましたが、奇妙なことに、Pythonは「配列が必要な型に安全にキャストできない」と言うので、機能しません。しかし、彼らはしない!左右のシリーズの長さは同じです。たぶんパンダはnpスタイルの構文を使ってスライスするときに作成されるシリーズではなく、データフレーム全体の長さを使用するでしょうか? – hmelberg

+0

@ user2040900:それは私のために働く。使用しているパンダのバージョンは何ですか?あなたはこれを試して何が起こるかの例を示すために質問を編集できますか? – BrenBarn

+0

編集例を参照してください。 Python 2.7、Pandas 0.10.1。 – hmelberg