Rでは、かなり便利なreplace
関数があります。基本的に、データフレームの特定の列で条件付きの再割り当てを行います。次のように使用できます:replace(df$column, df$column==1,'Type 1');
パンダで同じことを達成する良い方法は何ですか?
apply
でラムダを使用する必要がありますか? (もしそうなら、行全体ではなく、指定された列への参照をどのように取得しますか?).
np.where
オン data_frame.values
?ここには非常に明白なものが欠けているようです。
任意の提案をいただければ幸いです。
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
replace
のパンダドキュメントには例がないので、ここでいくつか紹介します。 (私のように)Rの観点からの場合、replace
は基本的に、R関数plyr::mapvalues
、plyr::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
正規表現
すべてのa
sをx
sに置き換えます。
In [27]: s.replace("a", "x", regex=True)
Out[27]:
0 xpe
1 monkey
2 sexgull
dtype: object
すべてのl
sをx
sに置き換えます。
In [28]: s.replace("l", "x", regex=True)
Out[28]:
0 ape
1 monkey
2 seaguxx
dtype: object
l
の両方のseagull
sが置き換えられたことに注意してください。
a
sをx
sに、l
sをp
sに置き換えます
In [29]: s.replace(["a", "l"], ["x", "p"], regex=True)
Out[29]:
0 xpe
1 monkey
2 sexgupp
dtype: object
複数の異なる値を同じ値に置き換えたいという特殊なケースでは、置換として単一の文字列を使用できます。リスト内にあってはなりません。 a
sとl
sをp
sに置き換えます
In [29]: s.replace(["a", "l"], "p", regex=True)
Out[29]:
0 ppe
1 monkey
2 sepgupp
dtype: object
(コメントでDaveL17へのクレジット)