Python не заменит строку в dataframe [duplicate]

К сожалению, значение таких вещей, как (и \ (меняются между регулярными выражениями стиля Emacs и большинством других стилей). Поэтому, если вы попытаетесь избежать этого, вы можете делать противоположное тому, что вы хотите.

Итак, вам действительно нужно знать, какой стиль вы пытаетесь процитировать.

19
задан bdiamante 30 June 2015 в 22:36
поделиться

6 ответов

Как насчет 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, в случае, если это имеет значение в последующих операциях.

30
ответ дан Zulan 16 August 2018 в 00:56
поделиться
  • 1
    +1 ясно лучшее решение – Andy Hayden 14 June 2013 в 19:41
  • 2
    обратите внимание, что вы можете захотеть сделать df.convert_objects() после замены на принуждение к соответствующим типам – Jeff 14 June 2013 в 19:45
  • 3
    Благодарю вас! – jonas 14 June 2013 в 19:47
  • 4
    @Dan Allan, это будет значение по умолчанию в 0.11.1, FYI (для конвертирования) – Jeff 14 June 2013 в 20:41

Вы можете использовать функцию 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
4
ответ дан bdiamante 16 August 2018 в 00:56
поделиться
  • 1
    Я работаю над такой проблемой, и я просто выполнил точные шаги, упомянутые в вашем ответе. Я не получаю выход. Код: wc = pd.read_csv ('PATH', usecols = ['Workclass']) – SRS 30 June 2015 в 22:03
  • 2
    df = pd.DataFrame (wc) конец строки wcdict = {"& quot;": 0, "Federal-gov": 1, "Local-gov": 2, "Never «Работающий»: 3, «Частный»: 4, «Self-emp-inc»: 5, «Self-emp-n-inc»: 6, «State-gov»: 7, «Без- pay ": 8} конец строки df.applymap (lambda s: wcdict.get (s), если s в wcdict else s) конец строки print (df) – SRS 30 June 2015 в 22:03
  • 3
    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
  • 4
    Это сработало! Спасибо :) У меня есть еще один вопрос, мне нужно работать с pyspark, а не работать с обычным python. Реализация этой логики отличается в pyspark? Когда я создал фрейм данных, я дал путь к файлу [как показано в приведенных выше комментариях], но я хотел бы дать RDD как входной сигнал в кадр данных. Я не мог этого сделать. Есть ли у вас какие-либо идеи по этому поводу? – SRS 30 June 2015 в 22:30
  • 5
    Рад, что это сработало. Я действительно не уверен ... возможно, это может быть началом? – bdiamante 30 June 2015 в 22:36

Я знаю, что это старо, но добавление для тех, кто искал меня. Создайте фрейм данных в pandas, df в этом коде

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

. Это даст вам карту словарей ip-адресов без необходимости ее записи.

9
ответ дан Brandon 16 August 2018 в 00:56
поделиться

Если никаких признаков не много:

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
ответ дан harrypotter0 16 August 2018 в 00:56
поделиться

Чтобы преобразовать строки типа 'volvo', 'bmw' в целые числа, сначала преобразуйте их в dataframe, затем передайте его pandas.get_dummies ()

  df  = DataFrame.from_csv("myFile.csv")
  df_transform = pd.get_dummies( df )
  print( df_transform )
1
ответ дан Samer Ayoub 16 August 2018 в 00:56
поделиться

Вы также можете сделать это с помощью 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'})
0
ответ дан tsando 16 August 2018 в 00:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: