Я хочу найти все значения в кадре данных Pandas, которые содержат пробелы (любое произвольное количество) и заменить эти значения на NaN.
Есть идеи, как это можно улучшить?
В основном я хочу включить это:
A B C
2000-01-01 -0.532681 foo 0
2000-01-02 1.490752 bar 1
2000-01-03 -1.387326 foo 2
2000-01-04 0.814772 baz
2000-01-05 -0.222552 4
2000-01-06 -1.176781 qux
В это:
A B C
2000-01-01 -0.532681 foo 0
2000-01-02 1.490752 bar 1
2000-01-03 -1.387326 foo 2
2000-01-04 0.814772 baz NaN
2000-01-05 -0.222552 NaN 4
2000-01-06 -1.176781 qux NaN
Мне удалось сделать это с кодом ниже, но человек это уродливо. Это не Pythonic, и я уверен, что это не самое эффективное использование панд тоже. Я перебираю каждый столбец и выполняю логическую замену для маски столбца, созданной с помощью функции, которая выполняет поиск регулярных выражений для каждого значения, сопоставляя его с пробелами.
for i in df.columns:
df[i][df[i].apply(lambda i: True if re.search('^\s*$', str(i)) else False)]=None
Это можно было бы немного оптимизировать, просматривая только поля, которые могут содержать пустые строки:
if df[i].dtype == np.dtype('object')
Но это не так много улучшения
И наконец, этот код устанавливает целевые строки в None, что работает с функциями Pandas fillna()
, но было бы неплохо для полноты, если бы я мог вставить NaN
непосредственно вместо None
.
replace
с регулярным выражением ... (возможно, это следует запрашивать как функцию).Ответы:
Я думаю, что
df.replace()
делает работу, так как панды 0,13 :Производит:
Как указал Темак , используйте,
df.replace(r'^\s+$', np.nan, regex=True)
если ваши действительные данные содержат пробелы.источник
pd.Series(["1", "#", "9", " .", None]).replace(r"( +\.)|#", "X", regex=True).values
что дает['1', 'X', '9', 'X', None]
df.replace(r'^\s+$', np.nan, regex=True)
Если вы хотите заменить пустую строку и записи только пробелами, правильный ответ :!
Принятый ответ
Не заменяет пустую строку !, вы можете попробовать себя с немного обновленным примером:
Также обратите внимание, что «fo o» не заменяется на Nan, хотя он содержит пробел. Далее обратите внимание, что это просто:
Также не работает - попробуйте.
источник
Как насчет:
applymap
Функция применяет функцию к каждой клетке dataframe.источник
isinstance
будет немного быстрее.''
. Чтобы рассмотреть также пустые строки, используйте:d = d.applymap(lambda x: np.nan if isinstance(x, basestring) and (not x or x.isspace()) else x)
Я сделал это:
или
Вы можете удалить все строки, а затем заменить пустые строки на
np.nan
.источник
Самое простое из всех решений:
источник
Если вы экспортируете данные из CSV-файла, это может быть так просто:
Это создаст фрейм данных, а также заменит пустые значения как Na
источник
skipinitialspace=True
также удаляет все пробелы после разделителя, что может привести к тому, что пустые строки будут считываться как пустые строкиnan
. Однако, если вы хотите сохранить начальные пробелы по какой-либо причине, этот вариант не является хорошим выбором.Для очень быстрого и простого решения, где вы проверяете равенство по одному значению, вы можете использовать
mask
метод.источник
Все они близки к правильному ответу, но я бы не сказал, что это решит проблему, оставаясь наиболее читабельным для других, читающих ваш код. Я бы сказал, что ответ - это комбинация ответа BrenBarn и комментария tuomasttik под этим ответом . В ответе BrenBarn используется
isspace
встроенная функция , но она не поддерживает удаление пустых строк в соответствии с запросом OP, и я склонен приписывать это стандартному сценарию замены строк на ноль.Я переписал это с
.apply
, так что вы можете позвонить наpd.Series
илиpd.DataFrame
.Python 3:
Чтобы заменить пустые строки или строки полностью пробелов:
Чтобы заменить строки полностью пробелов:
Чтобы использовать это в Python 2, вам нужно заменить
str
наbasestring
.Python 2:
Чтобы заменить пустые строки или строки полностью пробелов:
Чтобы заменить строки полностью пробелов:
источник
Это сработало для меня. Когда я импортирую свой CSV-файл, я добавил na_values = ''. Пробелы не включены в значения NaN по умолчанию.
df = pd.read_csv (filepath, na_values = '')
источник
Вы также можете использовать фильтр, чтобы сделать это.
источник
источник
Это не элегантное решение, но, похоже, работает сохранение в XLSX и его импорт обратно. Другие решения на этой странице не работали для меня, не знаю почему.
источник