23

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

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

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

で使用する必要がありnp.whereますdata_frame.valuesか?私はここで非常に明白なことを見逃しているようです。

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

4

2 に答える 2

31

pandasreplaceメソッドもあります:

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
于 2012-08-28T04:25:10.727 に答える
8

のパンダのドキュメントにreplaceは例がないので、ここでいくつか紹介します。私のようにRの観点から来た人にとっては、基本的にはR関数とのreplace機能を組み合わせた万能の置換関数です。DSMは単一値の場合をカバーしているので、複数値の場合をカバーします。plyr::mapvaluesplyr::revaluestringr::str_replace_all

シリーズ例

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つのリスト(またはパンダシリーズ)と、それらを置き換えたい値の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をsに置き換えますx

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

lすべてのsをsに置き換えますx

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

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

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

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

複数の異なる値を同じ値で置き換えたいという特殊なケースでは、置き換えとして1つの文字列を使用するだけで済みます。リスト内に含めることはできません。asとlsをpsに置き換えます

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

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

于 2016-11-29T00:19:55.843 に答える