К сожалению, значение таких вещей, как (и \ (меняются между регулярными выражениями стиля Emacs и большинством других стилей). Поэтому, если вы попытаетесь избежать этого, вы можете делать противоположное тому, что вы хотите.
Итак, вам действительно нужно знать, какой стиль вы пытаетесь процитировать.
Как насчет 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 в комментариях, в версиях панд & lt; 0.11.1, вручную привяжите .convert_objects()
к концу, чтобы правильно преобразовать tesst и установить столбцы int64
, в случае, если это имеет значение в последующих операциях.
Вы можете использовать функцию 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
df.applymap(lambda s: mymap.get(s) if s in mymap else s)
не делает встроенных изменений в df, поэтому ваш оператор print df
не будет отражать результаты приложения map. Вам нужно выполнить настрой, например df2 = df.applymap(lambda s: mymap.get(s) if s in mymap else s)
. print df2
теперь будут отражать изменения.
– bdiamante
30 June 2015 в 22:16
Я знаю, что это старо, но добавление для тех, кто искал меня. Создайте фрейм данных в pandas, df в этом коде
ip_addresses = df.source_ip.unique()
ip_dict = dict(zip(ip_addresses, range(len(ip_addresses))))
. Это даст вам карту словарей ip-адресов без необходимости ее записи.
Если никаких признаков не много:
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.
Чтобы преобразовать строки типа 'volvo', 'bmw' в целые числа, сначала преобразуйте их в dataframe, затем передайте его pandas.get_dummies ()
df = DataFrame.from_csv("myFile.csv")
df_transform = pd.get_dummies( df )
print( df_transform )
Вы также можете сделать это с помощью 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]
Вы также можете передать объект, похожий на диктофон, для сопоставления переименование, например:
In [72]: s.cat.rename_categories({1: 'x', 2: 'y', 3: 'z'})
df.convert_objects()
после замены на принуждение к соответствующим типам – Jeff 14 June 2013 в 19:45