web-dev-qa-db-ja.com

python pandasデータフレーム内の文字列を数字に置き換える

とにかくマッピング機能を使用するか、データフレーム全体の値を置き換えるために何か良い方法がありますか?

シリーズでマッピングを実行する方法しか知りません。

「tesst」列と「set」列の文字列を、たとえばset = 1、test = 2などの数字に置き換えたい

これが私のデータセットの例です:(元のデータセットは非常に大きいです)

ds_r
  respondent  brand engine  country  aware  aware_2  aware_3  age tesst   set
0          a  volvo      p      swe      1        0        1   23   set   set
1          b  volvo   None      swe      0        0        1   45   set   set
2          c    bmw      p       us      0        0        1   56  test  test
3          d    bmw      p       us      0        1        1   43  test  test
4          e    bmw      d  germany      1        0        1   34   set   set
5          f   audi      d  germany      1        0        1   59   set   set
6          g  volvo      d      swe      1        0        0   65  test   set
7          h   audi      d      swe      1        0        0   78  test   set
8          i  volvo      d       us      1        1        1   32   set   set

最終結果は

 ds_r
  respondent  brand engine  country  aware  aware_2  aware_3  age  tesst  set
0          a  volvo      p      swe      1        0        1   23      1    1
1          b  volvo   None      swe      0        0        1   45      1    1
2          c    bmw      p       us      0        0        1   56      2    2
3          d    bmw      p       us      0        1        1   43      2    2
4          e    bmw      d  germany      1        0        1   34      1    1
5          f   audi      d  germany      1        0        1   59      1    1
6          g  volvo      d      swe      1        0        0   65      2    1
7          h   audi      d      swe      1        0        0   78      2    1
8          i  volvo      d       us      1        1        1   32      1    1

助言に感謝し、

29
jonas

_DataFrame.replace_ についてはどうですか?

_In [9]: mapping = {'set': 1, 'test': 2}

In [10]: df.replace({'set': mapping, 'tesst': mapping})
Out[10]: 
   Unnamed: 0 respondent  brand engine  country  aware  aware_2  aware_3  age  \
0           0          a  volvo      p      swe      1        0        1   23   
1           1          b  volvo   None      swe      0        0        1   45   
2           2          c    bmw      p       us      0        0        1   56   
3           3          d    bmw      p       us      0        1        1   43   
4           4          e    bmw      d  germany      1        0        1   34   
5           5          f   audi      d  germany      1        0        1   59   
6           6          g  volvo      d      swe      1        0        0   65   
7           7          h   audi      d      swe      1        0        0   78   
8           8          i  volvo      d       us      1        1        1   32   

  tesst set  
0     2   1  
1     1   2  
2     2   1  
3     1   2  
4     2   1  
5     1   2  
6     2   1  
7     1   2  
8     2   1  
_

@Jeffがコメントで指摘したように、pandasバージョン<0.11.1で、手動で.convert_objects()を最後に追加してtesstを適切に変換し、_int64_に設定します後続の操作で重要な場合の列。

45
Dan Allan

私はこれが古いことを知っていますが、私がそうであったようにそれらの検索のために追加します。このコードでpandas、dfにデータフレームを作成します

ip_addresses = df.source_ip.unique()
ip_dict = dict(Zip(ip_addresses, range(len(ip_addresses))))

それはあなたにそれを書き出すことなくあなたにIPアドレスの辞書マップを提供します。

18
Brandon

これを行うには、applymap DataFrame関数を使用できます。

In [26]: df = DataFrame({"A": [1,2,3,4,5], "B": ['a','b','c','d','e'],
                         "C": ['b','a','c','c','d'], "D": ['a','c',7,9,2]})
In [27]: df
Out[27]:
   A  B  C  D
0  1  a  b  a
1  2  b  a  c
2  3  c  c  7
3  4  d  c  9
4  5  e  d  2

In [28]: mymap = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}

In [29]: df.applymap(lambda s: mymap.get(s) if s in mymap else s)
Out[29]:
   A  B  C  D
0  1  1  2  1
1  2  2  1  3
2  3  3  3  7
3  4  4  3  9
4  5  5  4  2
5
bdiamante

'volvo'、 'bmw'などの文字列を整数に変換するには、まずデータフレームに変換してからpandas.get_dummies()に渡します

  df  = DataFrame.from_csv("myFile.csv")
  df_transform = pd.get_dummies( df )
  print( df_transform )
1
Samer Ayoub

機能がそれほど多くない場合:

mymap = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}
df.applymap(lambda s: mymap.get(s) if s in mymap else s)

手動でできない場合:

temp_df2 = pd.DataFrame({'data': data.data.unique(), 'data_new':range(len(data.data.unique()))})# create a temporary dataframe 
data = data.merge(temp_df2, on='data', how='left')# Now merge it by assigning different values to different strings.
0
Akash Kandpal

pandas rename_categories。]を使用してこれを行うこともできます。最初に列をdtype="category"として定義する必要があります。

In [66]: s = pd.Series(["a","b","c","a"], dtype="category")

In [67]: s
Out[67]: 
0    a
1    b
2    c
3    a
dtype: category
Categories (3, object): [a, b, c]

そして、それらの名前を変更します:

In [70]: s.cat.rename_categories([1,2,3])
Out[70]: 
0    1
1    2
2    3
3    1
dtype: category
Categories (3, int64): [1, 2, 3]

また、dict-likeオブジェクトを渡して、名前の変更をマッピングすることもできます。例:

In [72]: s.cat.rename_categories({1: 'x', 2: 'y', 3: 'z'})
0
tsando

df.replace(to_replace=['set', 'test'], value=[1, 2])から@Ishnarkが受け入れられた答えにコメントします。

0
Chapo