Pythonic/эффективный способ сбрасывать пробелы из каждой ячейки фрейма данных Pandas, в которой есть строковый объект
Я читаю CSV файл в DataFrame. Мне нужно удалить пробелы из всех строк, оставляя остальные ячейки неизменными в Python 2.7.
Вот что я делаю:
def remove_whitespace( x ):
if isinstance( x, basestring ):
return x.strip()
else:
return x
my_data = my_data.applymap( remove_whitespace )
Есть ли лучший или более идиоматический способ Pandas для этого?
Есть ли более эффективный способ (возможно, делая вещи столбцами мудрый)?
Я попытался найти окончательный ответ, но большинство вопросов по этой теме, похоже, заключается в том, как удалять пробелы из самих имен столбцов или предполагать, что все ячейки являются строками.
Ответы
Ответ 1
Наткнулся на этот вопрос, ища быстрый и минималистский фрагмент, который я мог бы использовать. Пришлось собрать его сам из сообщений выше. Возможно, кому-то это будет полезно:
data_frame_trimmed = data_frame.apply(lambda x: x.str.strip() if x.dtype == "object" else x)
Ответ 2
Вы можете использовать метод pandas 'Series.str.strip()
, чтобы сделать это быстро для каждого столбца, подобного столбцу:
>>> data = pd.DataFrame({'values': [' ABC ', ' DEF', ' GHI ']})
>>> data
values
0 ABC
1 DEF
2 GHI
>>> data['values'].str.strip()
0 ABC
1 DEF
2 GHI
Name: values, dtype: object
Ответ 3
Когда вы вызываете pandas.read_csv
, вы можете использовать регулярное выражение, которое соответствует нулевому или более пробелам, за которым следует запятая, а в качестве разделителя - ноль или более пробелов.
Например, здесь "data.csv"
:
In [19]: !cat data.csv
1.5, aaa, bbb , ddd , 10 , XXX
2.5, eee, fff , ggg, 20 , YYY
(Первая строка заканчивается тремя пробелами после XXX
, а вторая строка заканчивается на последней Y
.)
Следующее использует pandas.read_csv()
для чтения файлов с регулярным выражением ' *, *'
в качестве разделителя. (Использование регулярного выражения в качестве разделителя доступно только в движке "python" read_csv()
.)
In [20]: import pandas as pd
In [21]: df = pd.read_csv('data.csv', header=None, delimiter=' *, *', engine='python')
In [22]: df
Out[22]:
0 1 2 3 4 5
0 1.5 aaa bbb ddd 10 XXX
1 2.5 eee fff ggg 20 YYY
Ответ 4
"data ['values']. str.strip()" ответ выше не работал у меня, но я нашел простую работу. Я уверен, что есть лучший способ сделать это. Функция str.strip() работает на Series. Таким образом, я преобразовал столбец dataframe в серию, разделил пробел, заменил преобразованный столбец обратно в dataframe. Ниже приведен пример кода.
import pandas as pd
data = pd.DataFrame({'values': [' ABC ', ' DEF', ' GHI ']})
print ('-----')
print (data)
data['values'].str.strip()
print ('-----')
print (data)
new = pd.Series([])
new = data['values'].str.strip()
data['values'] = new
print ('-----')
print (new)
Ответ 5
Мы хотим:
-
Примените нашу функцию к каждому элементу в нашем фрейме данных - используйте applymap
.
-
Используйте type(x)==str
(против x.dtype == 'object'
), потому что Pandas будет помечать столбцы как object
для столбцов смешанных типов данных (столбец object
может содержать int
и/или str
).
- Поддерживайте тип данных каждого элемента (мы не хотим преобразовывать все в
str
а затем удалять пробелы).
Поэтому я нашел следующее проще всего:
df.applymap(lambda x: x.strip() if type(x)==str else x)
Ответ 6
Ниже приведено решение по столбцам с pandas:
import numpy as np
def strip_obj(col):
if col.dtypes == object:
return (col.astype(str)
.str.strip()
.replace({'nan': np.nan}))
return col
df = df.apply(strip_obj, axis=0)
Это преобразует значения в столбцы типа объекта в строку. Следует проявлять осторожность при использовании столбцов смешанного типа. Например, если ваша колонка - это почтовые индексы с 20001 и "21110", вы получите "20001" и "21110".
Ответ 7
Я нашел следующий код полезным и кое-что, что, вероятно, поможет другим. Этот фрагмент позволит вам удалить пробелы в столбце, а также во всем DataFrame, в зависимости от вашего варианта использования.
import pandas as pd
def remove_whitespace(x):
try:
# remove spaces inside and outside of string
x = "".join(x.split())
except:
pass
return x
# Apply remove_whitespace to column only
df.orderId = df.orderId.apply(remove_whitespace)
print(df)
# Apply to remove_whitespace to entire Dataframe
df = df.applymap(remove_whitespace)
print(df)
Ответ 8
Это сработало для меня - применимо ко всему фрейму данных:
def panda_strip(x):
r =[]
for y in x:
if isinstance(y, str):
y = y.strip()
r.append(y)
return pd.Series(r)
df = df.apply(lambda x: panda_strip(x))