Как сопоставить грязные строки с числами в pandas

#python #pandas

#python #pandas

Вопрос:

Я работаю над проектом python, и я работаю с данными из файла csv, и я пытаюсь преобразовать пользовательские данные во что-то полезное, преобразуя данные из строк в значения с плавающей запятой. Вот один из таких соответствующих столбцов данных

 F10
White
White
Black
Asian-Pac-Islander
White
Black
...
  

Это код, который я использую;

 trainData = pd.read_csv('train.csv')
trainData['F10'].map({' White': 0, ' Black': 1, ' Asian-Pac-Islander': 2, 'white': 0, 'White': 0, 'Black': 1, 'Asian-Pac-Islander': 2,  " White": 0, " Black": 1, " Asian-Pac-Islander": 2, "white": 0, "White": 0, "Black": 1, "Asian-Pac-Islander": 2})
  

К сожалению, несмотря на это, когда я распечатываю trainData, строки Asian-Pac-Islander, White, Black все еще отображаются. Я использовал это в качестве руководства, что я делаю не так?

Ответ №1:

  • Всегда лучше работать со значениями в нижнем регистре, поэтому вам не нужно сопоставлять все варианты. Это может быть достигнуто с str.lower() помощью .
  • Используется str.strip() для удаления начальных и конечных пробелов
 import pandas as pd

# test dataframe
trainData = pd.DataFrame({'F10': ['White ', 'White', 'Black', ' Asian-Pac-Islander', ' White ', ' Black']})

# strip, lower and map
trainData['F10_numeric'] = trainData['F10'].str.strip().str.lower().map({'white': 0, 'black': 1, 'asian-pac-islander': 2})

# display(trainData)
                   F10  F10_numeric
0               White             0
1                White            0
2                Black            1
3   Asian-Pac-Islander            2
4               White             0
5                Black            1
  
  • Предыдущий код не исправляет F10 столбец, он только корректирует его для сопоставления.
  • Следующее, обновит F10 , а затем сопоставит значения с числами.
 # fix F10
trainData['F10'] = trainData['F10'].str.strip().str.lower()

# map on the fixed F10 column
trainData['F10_numeric'] = trainData['F10'].map({'white': 0, 'black': 1, 'asian-pac-islander': 2})

# display(trainData)
                  F10  F10_numeric
0               white            0
1               white            0
2               black            1
3  asian-pac-islander            2
4               white            0
5               black            1
  

Ответ №2:

Если вы хотите изменить фактический столбец в dataframe, вы должны использовать это:

 trainData['F10'].replace({' White': 0, ' Black': 1, ' Asian-Pac-Islander': 2, 'white': 0, 'White': 0, 'Black': 1, 'Asian-Pac-Islander': 2,  " White": 0, " Black": 1, " Asian-Pac-Islander": 2, "white": 0, "White": 0, "Black": 1, "Asian-Pac-Islander": 2}, inplace=True)
  

обратите внимание, что я использовал inplace=True

Лучшей альтернативой, которая не требует inplace=True , было бы следующее:

 trainData['F10'] = trainData['F10'].str.strip().str.lower().replace({'white': 0, 'black': 1, 'asian-pac-islander': 2})