Я знаю, что цель numpy pandas et c - избежать зацикливания, но у меня был такой сценарий - PullRequest
0 голосов
/ 29 января 2020

Итак, это мои задачи:
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? Это просто знать, если вы думаете, что это хорошее решение, и в противном случае, если есть какой-либо другой способ, пожалуйста, я хотел бы услышать это

...