Ведущие или конечные пробелы и pandas value_counts vs boolean selection

64
11

Я работаю с файловой рамкой, созданной из файла csv, загруженного из моего отдела шерифа округа. Данные находятся здесь и могут быть прочитаны с использованием read_csv(). Информационный кадр содержит информацию об инцидентах, о которых сообщается и действует шерифом. Один из столбцов - это город, в котором произошел инцидент, и я пытаюсь создать таблицу и график, показывающий изменение числа инцидентов для моей области (Ларкфилд) со временем.

Когда я использую функцию panda value_counts, используя "город" в качестве ввода, я получаю

In [86]: compcounts = soco['city'].value_counts()
In [96]: compcounts[0:10]
Out[96]:
SANTA ROSA 55291
WINDSOR 31711
SONOMA 28840
GUERNEVILLE 9309
BOYES HOT SPRINGS 8006
PETALUMA 6103
EL VERANO 5969
GEYSERVILLE 5822
LARKFIELD 5398
FORESTVILLE 5312
dtype: int64'

Для моей области есть 5398 отчетов ("Ларкфилд"). Но когда я пытаюсь получить подмножество dataframe для своей области, используя

larkfieldcomps = soco[soco['city'] == "LARKFIELD"]

он возвращает только 115 значений, а не 5398:

In [94]: larkcounts = larkfieldcomps['year'].value_counts()
In [95]: larkcounts
Out[95]:
2015 114
2013 1
dtype: int64

Я подумал, может быть, проблема в том, что в некоторых записях было одно или несколько пробелов до или после "LARKFIELD" в описании инцидента, поэтому я сделал поиск/замену, чтобы попытаться вырезать любые пробелы, но я все равно получаю только 115 значений, поиск по "LARKFIELD", хотя я знаю, что в этой области еще много инцидентов.

Это мой первый вопрос в Stackoverflow... Я исследовал это до смерти, но пока не получил ответа. Мы ценим любые предложения.

спросил(а) 2021-01-25T11:10:36+03:00 4 месяца, 3 недели назад
1
Решение
63

Я могу несколько объяснить это после загрузки данных (и чтения в read_csv с read_csv с использованием настроек по умолчанию). Похоже, что там есть ведущее или конечное пространство. Очевидно, value_counts достаточно умен, чтобы игнорировать это при добавлении вещей, но логический выбор гораздо более буквальный.

>>> soco[soco['city'] == "LARKFIELD"].city.count()
122

>>> soco['city2'] = soco.city.str.strip()

>>> soco[soco['city2'] == "LARKFIELD"].city.count()
5520

И когда я смотрю немного ближе, кажется, что 5398 имеют 11 конечных пробелов и 122 не имеют пробелов. Так что разница. (Я не уверен, почему вы нашли 115 значений за год вместо 122, но это, скорее всего, из-за некоторых недостающих значений за год, однако вы его создали.)

Но затем я сделал это, чтобы дважды проверить поведение value_counts потому что я предполагал, что ведущее и конечное пространства имеют значение.

>>> pd.Series( [' foo','foo','foo '] ).value_counts() 
foo 1
foo 1
foo 1

И, да, в этом простом примере действительно важны ведущие и завершающие пробелы. Но они не в вашем 'soco' dataframe???

Таким образом, здесь все еще есть некоторые недостатки, но, надеюсь, это хорошее начало для выяснения того, что здесь происходит.

ответил(а) 2021-01-25T11:10:36+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема