9

数年にわたるデータフレームがあり、ある時点で民族性のコードが変更されました。したがって、年を条件として値を再コード化する必要があります。これは、同じデータフレームの別の列です。たとえば、1 から 3、2 から 3、3 から 4 などです。

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

そして、これは 1996 年から 2001 年についてのみ行われます。同じ列 (民族) の他の年の値は変更してはなりません。非効率なループが多すぎるのを避けるために、次のことを試しました。

    recode_years = range(1996,2002)
    for year in recode_years:
        df['ethnicity'][df.year==year].replace(old, new, inplace=True)

ただし、データフレームの元の値は変更されませんでした。replace メソッド自体は新しい値を正しく置き換えて返しましたが、条件を適用するときに inplace オプションが元のデータフレームに影響を与えないようです。これは、経験豊富な Pandas ユーザーには明らかかもしれませんが、すべての単一要素をループする代わりに、これを行う簡単な方法があるに違いありません。

編集 (x2): 彼女は別のアプローチの例であり、これも機能しませんでした (「置換の長さはシリーズの長さと等しくなければなりません」および「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)

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

4

1 に答える 1

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)
于 2013-04-22T17:59:58.753 に答える