web-dev-qa-db-ja.com

Python pandas replaceと同等

Rでは、かなり便利なreplace関数があります。基本的に、データフレームの特定の列で条件付きの再割り当てを行います。次のように使用できます:replace(df$column, df$column==1,'Type 1');

パンダで同じことを達成する良い方法は何ですか?

applyでラムダを使用する必要がありますか? (もしそうなら、行全体ではなく、指定された列への参照をどのように取得しますか?).

np.where オン data_frame.values?ここには非常に明白なものが欠けているようです。

任意の提案をいただければ幸いです。

21
ivan-k

pandasにもreplaceメソッドがあります:

In [25]: df = DataFrame({1: [2,3,4], 2: [3,4,5]})

In [26]: df
Out[26]: 
   1  2
0  2  3
1  3  4
2  4  5

In [27]: df[2]
Out[27]: 
0    3
1    4
2    5
Name: 2

In [28]: df[2].replace(4, 17)
Out[28]: 
0     3
1    17
2     5
Name: 2

In [29]: df[2].replace(4, 17, inplace=True)
Out[29]: 
0     3
1    17
2     5
Name: 2

In [30]: df
Out[30]: 
   1   2
0  2   3
1  3  17
2  4   5

または、numpyスタイルの高度なインデックスを使用できます。

In [47]: df[1]
Out[47]: 
0    2
1    3
2    4
Name: 1

In [48]: df[1] == 4
Out[48]: 
0    False
1    False
2     True
Name: 1

In [49]: df[1][df[1] == 4]
Out[49]: 
2    4
Name: 1

In [50]: df[1][df[1] == 4] = 19

In [51]: df
Out[51]: 
    1   2
0   2   3
1   3  17
2  19   5
28
DSM

replace のパンダドキュメントには例がないので、ここでいくつか紹介します。 (私のように)Rの観点からの場合、replaceは基本的に、R関数plyr::mapvaluesplyr::revalueおよびstringr::str_replace_allの機能を組み合わせた多目的の置換関数です。 。 DSMは単一の値のケースをカバーしたので、私は複数の値のケースをカバーします。

シリーズ例

In [10]: x = pd.Series([1, 2, 3, 4])

In [11]: x
Out[11]: 
0    1
1    2
2    3
3    4
dtype: int64

正の整数を負の整数に置き換えたい(そして-1を掛けないで)。

2つの値のリスト

これを行う1つの方法は、置換する値の1つのリスト(またはpandas series))と、置換する値を含む2番目のリストを用意することです。

In [14]: x.replace([1, 2, 3, 4], [-1, -2, -3, -4])
Out[14]: 
0   -1
1   -2
2   -3
3   -4
dtype: int64

これはplyr::mapvaluesに対応します。

値ペアの辞書

値のペアの辞書を用意しておくと便利な場合があります。インデックスは置き換えるインデックスであり、値は置き換えるインデックスです。

In [15]: x.replace({1: -1, 2: -2, 3: -3, 4: -4})
Out[15]: 
0   -1
1   -2
2   -3
3   -4
dtype: int64

これはplyr::revalueに対応します。

文字列

文字列に対しても同様に機能しますが、正規表現パターンを使用するオプションもあります。

単に文字列を他の文字列で置き換えたい場合は、以前とまったく同じように機能します。

In [18]: s = pd.Series(["ape", "monkey", "seagull"])
In [22]: s
Out[22]: 
0        ape
1     monkey
2    seagull
dtype: object

2つのリスト

In [25]: s.replace(["ape", "monkey"], ["lion", "panda"])
Out[25]: 
0       lion
1      panda
2    seagull
dtype: object

辞書

In [26]: s.replace({"ape": "lion", "monkey": "panda"})
Out[26]: 
0       lion
1      panda
2    seagull
dtype: object

正規表現

すべてのasをxsに置き換えます。

In [27]: s.replace("a", "x", regex=True)
Out[27]: 
0        xpe
1     monkey
2    sexgull
dtype: object

すべてのlsをxsに置き換えます。

In [28]: s.replace("l", "x", regex=True)
Out[28]: 
0        ape
1     monkey
2    seaguxx
dtype: object

lの両方のseagullsが置き換えられたことに注意してください。

asをxsに、lsをpsに置き換えます

In [29]: s.replace(["a", "l"], ["x", "p"], regex=True)
Out[29]: 
0        xpe
1     monkey
2    sexgupp
dtype: object

複数の異なる値を同じ値に置き換えたいという特殊なケースでは、置換として単一の文字列を使用できます。リスト内にあってはなりません。 asとlsをpsに置き換えます

In [29]: s.replace(["a", "l"], "p", regex=True)
Out[29]: 
0        ppe
1     monkey
2    sepgupp
dtype: object

(コメントでDaveL17へのクレジット)

6
Deleet