2013-06-14 3 views
17

Есть ли способ использовать функцию сопоставления или что-то более эффективное для замены значений во всей области данных?python pandas, заменяющий строки в dataframe номерами

Я знаю, как выполнять сопоставление по сериям.

Я хотел бы заменить строки в «tesst» и в столбце «набор» с номером , например, набор = 1, тест = 2

Вот пример моего набора данных: (Original набор данных очень большой)

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 

благодарен за советом,

ответ

23

Что о 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 отметил в комментариях, в панд версии < 0.11.1, вручную лавировать .convert_objects() на конце, чтобы правильно преобразовать tesst и установить в int64 столбцов, в случае, что имеет значение в последующих операциях.

+0

+1 ясно лучшее решение –

+1

Обратите внимание, что вы можете захотеть сделать '' df.convert_objects() '' после замены на принуждение к надлежащим dtypes – Jeff

+0

Спасибо, место на !! – jonas

4

Вы можете использовать функцию 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 
+0

Я работаю над этой проблемой, как это, и я просто следую точные шаги, упомянутые в вашем ответе. Я не получаю выход. ** Код: ** wc = pd.read_csv ('PATH', usecols = ['Workclass']) – SRS

+0

df = pd.DataFrame (wc) ** конец строки ** wcdict = {"?": 0, «Федеральное правительство»: 1, «Местные правители»: 2, «Неработающие»: 3, «Частный»: 4, «Self-emp-inc»: 5, «Self-emp-n-inc» : 6, «Государство-го»: 7, «Без оплаты»: 8} ** конец строки ** df.applymap (lambda s: wcdict.get (s) if s in wcdict else s) ** end строки ** print (df) – SRS

+0

'df.applymap (lambda s: mymap.get (s), если s в mymap else s)' не вносит встроенные изменения в df, поэтому ваш оператор 'print df' не будет отражать результаты применения карты. Вам нужно сделать настройку типа 'df2 = df.applymap (lambda s: mymap.get (s), если s в mymap else s)'. 'print df2' теперь будет отражать изменения. – bdiamante

7

Я знаю, что это старый, но добавление для тех, кто искал меня. Создание dataframe в панде, ДФ в этом коде

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

Это даст вам словарь карты IP-адрес без необходимости писать его.

0

Для преобразования строк, как «вольво», «БМВ» в целые числа сначала преобразовать его в dataframe затем передать его pandas.get_dummies()

df = DataFrame.from_csv("myFile.csv") 
    df_transform = pd.get_dummies(df) 
    print(df_transform) 
Смежные вопросы