Pandas DataFrameの列値を置き換える


141

データフレームの1つの列の値を置き換えようとしています。列( 'female')には、値 'female'および 'male'のみが含まれます。

私は以下を試しました:

w['female']['female']='1'
w['female']['male']='0' 

ただし、以前の結果とまったく同じコピーを受け取ります。

理想的には、次のループに似た出力を要素ごとに取得したいと思います。

if w['female'] =='female':
    w['female'] = '1';
else:
    w['female'] = '0';

gotchasのドキュメント(http://pandas.pydata.org/pandas-docs/stable/gotchas.html)を調べましたが、何も起こらない理由がわかりません。

どんな助けでもありがたいです。

回答:


259

私が正しく理解しているなら、あなたはこのようなものが欲しいです:

w['female'] = w['female'].map({'female': 1, 'male': 0})

(ここでは、値を数値を含む文字列ではなく数値に変換しています。本当に必要な場合は、"1""0"に変換できますが、なぜそうしたいのかはわかりません。)

使用しているので理由は、あなたのコードは、仕事があるしない['female']列(第2に'female'、あなたの中にはw['female']['female'])「の値が『女性』である行を選択」を意味するものではありません。これは、インデックスが「女性」である行を選択することを意味します。DataFrameにはないものがあります。


6
ありがとう。まさに私が探していたもの。「女性」を1に、それ以外を「0」にマッピングする場合。それはどのように機能しますか?
ブラック

17
列のすべての値がマップ関数で指定されている場合にのみ、これを使用します。マップ関数で指定されていない列値は、ナンに置き換えられます。
Chandra

1
私はまた、使用することをお勧めします.loc回避するために、構文をSettingWithCopyWarningpandas.pydata.org/pandas-docs/stable/...
NickBraunagel

2
.mapの代わりに.replaceを使用
JS noob

「。」を取り除く方法 2つ以上の列で数千のうち、理解できません。ありがとうございました
M.マリスカル

115

locを使用して、データフレームのサブセットを編集できます。

df.loc[<row selection>, <column selection>]

この場合:

w.loc[w.female != 'female', 'female'] = 0
w.loc[w.female == 'female', 'female'] = 1

1
条件によって特定の行を選択する必要がなく、特定の列のすべての行を選択する必要があるように、それをどのように適応させるのですか?したがって、列のすべてのセルを特定の値に変更します。
Dhruv Ghulati 2016

3
@ DhruvGhulati、df.loc [:, <column selection>]を使用します




11

また、使用することができapply.get、すなわち

w['female'] = w['female'].apply({'male':0, 'female':1}.get)

w = pd.DataFrame({'female':['female','male','female']})
print(w)

データフレームw

   female
0  female
1    male
2  female

apply辞書の値を置き換えるために使用:

w['female'] = w['female'].apply({'male':0, 'female':1}.get)
print(w)

結果:

   female
0       1
1       0
2       1 

注: applyデータフレーム内の列のすべての可能な値がディクショナリで定義されている場合はディクショナリを使用する必要があります。それ以外の場合は、ディクショナリで定義されていない列は空になります。


8

これは非常にコンパクトです:

w['female'][w['female'] == 'female']=1
w['female'][w['female'] == 'male']=0

別の良いもの:

w['female'] = w['female'].replace(regex='female', value=1)
w['female'] = w['female'].replace(regex='male', value=0)

最初の例は連鎖インデックスであり、結果のdfがコピーであるかビューであるかを保証できないため、警告されます。連鎖インデックスを
Nordle 2018

7

あるいは、これらの種類の割り当てのための組み込み関数pd.get_dummiesがあります。

w['female'] = pd.get_dummies(w['female'],drop_first = True)

これにより、w ['female']で発生する各値に1つずつ、最初にドロップした2つの列を持つデータフレームが得られます(残っている列から推測できるため)。新しい列には、置き換えた文字列として自動的に名前が付けられます。

これは、2つ以上の可能な値を持つカテゴリー変数がある場合に特に役立ちます。この関数は、すべてのケースを区別するために必要な数のダミー変数を作成します。データフレーム全体を1つの列に割り当てないように注意してください。代わりに、w ['female']が「male」、「female」、または「neutral」の場合は、次のようにします。

w = pd.concat([w, pd.get_dummies(w['female'], drop_first = True)], axis = 1])
w.drop('female', axis = 1, inplace = True)

次に、「女性」のダミーコーディングを提供する2つの新しい列が残り、文字列で列を削除しました。


4

使用Series.mapしてSeries.fillna

列に含まれる文字列がfemaleand だけmaleSeries.mapはない場合、NaN他の値を返すため、この場合は失敗します。

そのため、次のようにチェーンする必要がありfillnaます。

.map失敗する例

df = pd.DataFrame({'female':['male', 'female', 'female', 'male', 'other', 'other']})

   female
0    male
1  female
2  female
3    male
4   other
5   other
df['female'].map({'female': '1', 'male': '0'})

0      0
1      1
2      1
3      0
4    NaN
5    NaN
Name: female, dtype: object

ための正しい方法で、我々は、チェーンmapfillna、我々は埋めるように、NaN元のカラムからの値で:

df['female'].map({'female': '1', 'male': '0'}).fillna(df['female'])

0        0
1        1
2        1
3        0
4    other
5    other
Name: female, dtype: object

2

このタイプの作業を自動的に実行するために使用できるpandas呼び出された関数もfactorizeあります。ラベルを数値に変換します:['male', 'female', 'male'] -> [0, 1, 0]。詳細については、この回答を参照してください。


0

私は答えとして、上で提案されたすべてのメソッドでどのタイプのオブジェクトを取得するかを指摘する必要があると思います:それはSeriesまたはDataFrameです。

w.female.or によって列を取得するとw[[2]](ここで、2は列の番号です)、DataFrameが返されます。したがって、この場合、次のようなDataFrameメソッドを使用できます。.replace

Series を使用.locまたはiloc取得するときに、Seriesに.replaceメソッドがないためapplymapなどのメソッドを使用する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.