Итак, это мои задачи:
1) Найти все столбцы в файле демографии, которые содержат строковые данные.
2) Избавиться от всех лишних пробелов.
Я обработал номер 1 и получил все значения столбцов в список с именем target.
target = []
target.extend(list(demo.select_dtypes(include=object)))
print(target)
[output]: ['RIDSTATR', 'RIAGENDR', 'RIDRETH1', 'DMQMILIT', 'DMDBORN',
'DMDCITZN', 'DMDYRSUS', 'DMDEDUC3', 'DMDEDUC2', 'DMDSCHOL', 'DMDMARTL']
Пока все хорошо, у меня есть все заголовки столбцов для записей строкового типа.
Затем пытаюсь исследовать данные Я пытался увидеть, что, где уникальные записи я пытался это
demo.loc[:,['RIDSTATR','RIAGENDR', 'RIDRETH1', 'DMQMILIT', 'DMDBORN',
'DMDCITZN', 'DMDYRSUS', 'DMD']].unique()
Получил это:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-15-f6b305e8c10b> in <module>
----> 1 demo.loc[:,['RIDSTATR','RIAGENDR', 'RIDRETH1', 'DMQMILIT', 'DMDBORN',
'DMDCITZN', 'DMDYRSUS', 'DMD']].unique()
2
~\Anaconda3\lib\site-packages\pandas\core\generic.py in __getattr__(self,
name)
5177 if
self._info_axis._can_hold_identifiers_and_holds_name(name):
5178 return self[name]
-> 5179 return object.__getattribute__(self, name)
5180
5181 def __setattr__(self, name, value):
AttributeError: 'DataFrame' object has no attribute 'unique'
Это происходит потому, что strip () является методом для серии панды, но не для фреймов данных и пытался использовать его в кадре данных
Итак, я попробовал это:
for column in target:
print(len(demo.loc[:,column].unique()))
print(demo.loc[:,column].unique())
и получил это:
71
['Exam ' 'Both ' 'Exam' 'Both' 'Both ' ' Exam ' ' Both' 'exam'
'Both Interviewed and MEC examined' ' Both Interviewed and MCE examined'
'Interview Only' ' Both' nan ' exam' ' Exam' ' Both ' 'Only Interview '
'Interviewed Only' 'Only Interview ' 'Interview ' 'exam '
' Both Interviewed and MEC examined' 'exam ' 'interview' ' Both '
'Only Interview' 'Interview' 'Both Interviewed and MEC examined '
' Both Interviewed and MEC examined' 'Interview Only '
' Interview Only' 'Both Interviewed and MEC examined ' ' Exam'
'Both Interviewed and MCE examined' ' Both Interviewed and MEC examined '
' Only Interview' ' Only Interview ' ' Both ' ' exam'
' Interview Only ' ' Both ' 'Interviewed Only ' ' Interview Only'
'Both Interviewed and MCE examined ' ' Interviewed Only' 'Exam '
'Both Interviewed and MCE examined ' 'Interview ' ' exam ' ' Exam '
' Both Interviewed and MCE examined' ' Interviewed Only'
' Only Interview ' ' Interview' ' Both Interviewed and MEC examined '
' exam ' 'interview ' ' Interview' ' Exam ' ' Only Interview'
' exam ' ' Interview Only ' 'Interview Only ' 'Interviewed Only '
' Exam ' ' interview' ' Both Interviewed and MEC examined '
' Interviewed Only ' ' Both Interviewed and MEC examined '
' interview' ' Interview Only ']
Обратите внимание, что это просто выходные данные для уникальных значений в первом столбце, который имеет только значения, там было 11 столбцов, по крайней мере, с 36 значениями, этот пример соответствует столбцу с именем 'RIDSTATR', который является первым элементом в целевом списке. Показывать весь вывод не имеет никакого смысла, поскольку он слишком длинный и не имеет значения для цели моего вопроса
Чтобы очистить некоторые повторяющиеся значения, я очистил начальные и конечные пробелы с помощью этого:
for column in target:
demo.loc[:, column] = demo.loc[:, column].str.strip()
Чтобы убедиться, что это работает, я запустил это в новой ячейке
for column in target:
print(len(demo.loc[:,column].unique()))
print(demo.loc[:, column].unique())
И получил это для того же первого столбца, который я показал ранее:
11
['Exam' 'Both' 'exam' 'Both Interviewed and MEC examined'
'Both Interviewed and MCE examined' 'Interview Only' nan 'Only Interview'
'Interviewed Only' 'Interview' 'interview']
Как вы можете видеть, у меня было 71 уникальное значение в этом столбце до 11, что является целью, но посмотрите, как я это сделал
for column in target:
demo.loc[:, column] = demo.loc[:, column].str.strip()
Весь вопрос в том, Знание цели numpy и pandas используется, чтобы избежать цикличности векторизации. Я думаю, что это может быть не самым эффективным решением. Примеры, приведенные учителем, нацелены только на 2 столбца, поэтому он вручную вводит имя столбца, чтобы изменить его, но мне нужно изменить 11 столбцов, делая то же самое, что учитель будет делать следующим образом:
demo.loc[:, 'RIDSTATR'] = demo.loc[:, 'RIDSTATR'].str.strip()
demo.loc[:, 'RIAGENDR'] = demo.loc[:, 'RIAGENDR'].str.strip()
demo.loc[:, 'RIDRETH1'] = demo.loc[:, 'RIDRETH1'].str.strip()
demo.loc[:, 'DMQMILIT'] = demo.loc[:, 'DMQMILIT'].str.strip()
И так далее с каждым из 11 столбцов.
Это было полное объяснение того, что я сделал, вопрос:
Что вы думаете о моем решении, это слишком плохо, потому что циклы могут быть неэффективен и его следует избегать при использовании numpy и pandas? Это просто знать, если вы думаете, что это хорошее решение, и в противном случае, если есть какой-либо другой способ, пожалуйста, я хотел бы услышать это