とにかくマッピング機能を使用するか、データフレーム全体の値を置き換えるために何か良い方法がありますか?
シリーズでマッピングを実行する方法しか知りません。
「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
助言に感謝し、
_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
_に設定します後続の操作で重要な場合の列。
私はこれが古いことを知っていますが、私がそうであったようにそれらの検索のために追加します。このコードでpandas、dfにデータフレームを作成します
ip_addresses = df.source_ip.unique()
ip_dict = dict(Zip(ip_addresses, range(len(ip_addresses))))
それはあなたにそれを書き出すことなくあなたにIPアドレスの辞書マップを提供します。
これを行うには、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
'volvo'、 'bmw'などの文字列を整数に変換するには、まずデータフレームに変換してからpandas.get_dummies()に渡します
df = DataFrame.from_csv("myFile.csv")
df_transform = pd.get_dummies( df )
print( df_transform )
機能がそれほど多くない場合:
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.
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'})
df.replace(to_replace=['set', 'test'], value=[1, 2])
から@Ishnarkが受け入れられた答えにコメントします。