Как удалить лишние пробелы из строк при разборе файла csv в Pandas?
У меня есть следующий файл с именем 'data.csv':
1997,Ford,E350
1997, Ford , E350
1997,Ford,E350,"Super, luxurious truck"
1997,Ford,E350,"Super ""luxurious"" truck"
1997,Ford,E350," Super luxurious truck "
"1997",Ford,E350
1997,Ford,E350
2000,Mercury,Cougar
И я хотел бы проанализировать его в pandas DataFrame, чтобы DataFrame выглядел следующим образом:
Year Make Model Description
0 1997 Ford E350 None
1 1997 Ford E350 None
2 1997 Ford E350 Super, luxurious truck
3 1997 Ford E350 Super "luxurious" truck
4 1997 Ford E350 Super luxurious truck
5 1997 Ford E350 None
6 1997 Ford E350 None
7 2000 Mercury Cougar None
Лучшее, что я мог сделать, это:
pd.read_table("data.csv", sep=r',', names=["Year", "Make", "Model", "Description"])
Который получает меня:
Year Make Model Description
0 1997 Ford E350 None
1 1997 Ford E350 None
2 1997 Ford E350 Super, luxurious truck
3 1997 Ford E350 Super "luxurious" truck
4 1997 Ford E350 Super luxurious truck
5 1997 Ford E350 None
6 1997 Ford E350 None
7 2000 Mercury Cougar None
Как я могу получить DataFrame без этих пробелов?
Ответы
Ответ 1
Вы можете использовать преобразователи:
import pandas as pd
def strip(text):
try:
return text.strip()
except AttributeError:
return text
def make_int(text):
return int(text.strip('" '))
table = pd.read_table("data.csv", sep=r',',
names=["Year", "Make", "Model", "Description"],
converters = {'Description' : strip,
'Model' : strip,
'Make' : strip,
'Year' : make_int})
print(table)
дает
Year Make Model Description
0 1997 Ford E350 None
1 1997 Ford E350 None
2 1997 Ford E350 Super, luxurious truck
3 1997 Ford E350 Super "luxurious" truck
4 1997 Ford E350 Super luxurious truck
5 1997 Ford E350 None
6 1997 Ford E350 None
7 2000 Mercury Cougar None
Ответ 2
Ну, пробелы в ваших данных, поэтому вы не можете читать данные без чтения в пробеле. Однако после того, как вы его прочитали, вы можете лишить пробелы, например, df["Make"] = df["Make"].map(str.strip)
(где df
- ваш фрейм данных).
Ответ 3
У меня недостаточно репутации, чтобы оставить комментарий, но ответ выше, предлагающий использовать функцию map
вместе с strip
, не будет работать, если у вас есть значения NaN, так как полоса работает только на символах, а NaN - плавает.
Для этого есть встроенная функция pandas, которую я использовал:
pd.core.strings.str_strip(df['Description'])
где df
- ваш dataframe. В моем случае я использовал его на DataFrame с ~ 1,2 миллиона строк, и это было очень быстро.
Ответ 4
Добавление параметра skipinitialspace=True
в read_table
работало для меня.
Итак, попробуйте:
pd.read_table("data.csv",
sep=r',',
names=["Year", "Make", "Model", "Description"],
skipinitialspace=True)
То же самое работает в pd.read_csv()
.
Ответ 5
Здесь функция для итерации по каждому столбцу и применения pd.core.strings.str_strip
:
def df_strip(df):
df = df.copy()
for c in df.columns:
if df[c].dtype == np.object:
df[c] = pd.core.strings.str_strip(df[c])
df = df.rename(columns={c:c.strip()})
return df
Ответ 6
Функция str.strip() отлично работает на Series. Таким образом, я конвертирую столбец dataframe, который содержит пробелы в Серии, разбивает пробелы с помощью функции str.strip(), а затем заменяет преобразованный столбец обратно на фрейм данных. Ниже приведен пример кода.
import pandas as pd
data = pd.DataFrame({'values': [' ABC ', ' DEF', ' GHI ']})
new = pd.Series([])
new = data['values'].str.strip()
data['values'] = new