Pandas DataFrame:条件に基づいて、列のすべての値を置き換えます


132

次のような単純なDataFrameがあります。

Pandas DataFrame

「First Season」列からすべての値を選択して、1990年を超える値を1に置き換えます。この例では、Baltimore Ravensのみが1996を1に置き換えます(残りのデータはそのままにします)。

私は以下を使用しました:

df.loc[(df['First Season'] > 1990)] = 1

ただし、「First Season」列の値だけでなく、その行のすべての値が1に置き換えられます。

その列の値だけを置き換えるにはどうすればよいですか?

回答:


226

その列を選択する必要があります。

In [41]:
df.loc[df['First Season'] > 1990, 'First Season'] = 1
df

Out[41]:
                 Team  First Season  Total Games
0      Dallas Cowboys          1960          894
1       Chicago Bears          1920         1357
2   Green Bay Packers          1921         1339
3      Miami Dolphins          1966          792
4    Baltimore Ravens             1          326
5  San Franciso 49ers          1950         1003

したがって、ここの構文は次のとおりです。

df.loc[<mask>(here mask is generating the labels to index) , <optional column(s)> ]

あなたはドキュメントをチェックすることができ、セマンティクスを示すパンダへ10分

編集

ブールインジケーターを生成する場合は、ブール条件を使用してブールシリーズを生成し、dtypeをintこれに変換TrueFalseて変換し、変換10ます。

In [43]:
df['First Season'] = (df['First Season'] > 1990).astype(int)
df

Out[43]:
                 Team  First Season  Total Games
0      Dallas Cowboys             0          894
1       Chicago Bears             0         1357
2   Green Bay Packers             0         1339
3      Miami Dolphins             0          792
4    Baltimore Ravens             1          326
5  San Franciso 49ers             0         1003

40

パーティーには少し遅れますが、それでも-私はnumpyを使用することを好みます:

import numpy as np
df['First Season'] = np.where(df['First Season'] > 1990, 1, df['First Season'])

2
列の値を条件付きで上書きするソリューションを探していましたが、次のように他の列の値に基づいています:df ['col1'] = np.where(df ['id'] == '318431682259014'、 'NEW'、 df ['col1'])これがその解決策でした。
user582175

このような複数の条件でこれを実行しようとしていますが、引き続き発生しValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()ます。私がやろうとしているのは、基本的にdf['A'] = np.where(df['B'] in some_values, df['A']*2, df['A]です。誰かこれについて考えがありますか?
M.Schalk

5
df['First Season'].loc[(df['First Season'] > 1990)] = 1

奇妙なことに、誰もこの答えを持っていません。コードの唯一の欠けている部分は、dfの直後の['First Season']であり、中の中括弧を削除するだけです。


これにより、 'SettingWithCopyWarning:'が得られます。EdChumの回答のように、全体に対して.locを使用することをお勧めします。
野心的な

2

単一条件、つまり ( 'employrate'] > 70 )

       country        employrate alcconsumption
0  Afghanistan  55.7000007629394            .03
1      Albania  51.4000015258789           7.29
2      Algeria              50.5            .69
3      Andorra                            10.17
4       Angola  75.6999969482422           5.57

これを使って:

df.loc[df['employrate'] > 70, 'employrate'] = 7

       country  employrate alcconsumption
0  Afghanistan   55.700001            .03
1      Albania   51.400002           7.29
2      Algeria   50.500000            .69
3      Andorra         nan          10.17
4       Angola    7.000000           5.57

したがって、ここでの構文は次のとおりです。

df.loc[<mask>(here mask is generating the labels to index) , <optional column(s)> ]

複数の条件の場合。 (df['employrate'] <=55) & (df['employrate'] > 50)

これを使って:

df['employrate'] = np.where(
   (df['employrate'] <=55) & (df['employrate'] > 50) , 11, df['employrate']
   )

out[108]:
       country  employrate alcconsumption
0  Afghanistan   55.700001            .03
1      Albania   11.000000           7.29
2      Algeria   11.000000            .69
3      Andorra         nan          10.17
4       Angola   75.699997           5.57

したがって、ここでの構文は次のとおりです。

 df['<column_name>'] = np.where((<filter 1> ) & (<filter 2>) , <new value>, df['column_name'])

0
df.loc[df['First season'] > 1990, 'First Season'] = 1

説明:

df.loc「行インデックス」と「列インデックス」の2つの引数を取ります。「First season」列の下で、値が各行の値の27より大きいかどうかを確認してから、1に置き換えます。

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