2016-04-07 5 views
1

Я импортировал файл csv с помощью pandas.Удалить запятую из объектов в столбце dataframe pandas

В моей информационной карте есть несколько столбцов под названием «Ферма», «Всего яблок» и «Хорошие яблоки».

Числовые данные, импортированные для «Всего яблок» и «Хорошие яблоки», содержат запятые, указывающие тысячи, например. 1,200 и т. Д. Я хочу удалить запятую, чтобы данные выглядели как 1200 и т.д.

Тип переменной для столбцов «Всего яблок» и «Хороших яблок» появляется как объект.

Я пробовал использовать df.str.replace и df.strip, но не был успешным.

Также попытался изменить тип переменной с объекта на строку и объект на целое, но не смог заставить его работать.

Любая помощь была бы принята с благодарностью.

**** EDIT ****

Выдержки данных из CSV файла импортирован с помощью pd.read_csv:

Farm_Name Total Apples Good Apples 
EM 18,327 14,176 
EE 18,785 14,146 
IW 635 486 
L 33,929 24,586 
NE 12,497 9,609 
NW 30,756 23,765 
SC 8,515 6,438 
SE 22,896 17,914 
SW 11,972 9,114 
WM 27,251 20,931 
Y 21,495 16,662 
+0

Что разделитель в файле? – ayhan

+0

см. [Этот вопрос] (http://stackoverflow.com/questions/22137723/convert-number-strings-with-commas-in-pandas-dataframe-to-float) – Grr

ответ

2

Я думаю, что вы можете добавьте параметр thousands в read_csv, затем значения в столбцах Total Apples и Good Apples преобразуются в integers:

Возможно, ваш separator отличается, не забудьте изменить его. Если разделитель является пробелом, измените его на sep='\s+'.

import pandas as pd 
import io 

temp=u"""Farm_Name;Total Apples;Good Apples 
EM;18,327;14,176 
EE;18,785;14,146 
IW;635;486 
L;33,929;24,586 
NE;12,497;9,609 
NW;30,756;23,765 
SC;8,515;6,438 
SE;22,896;17,914 
SW;11,972;9,114 
WM;27,251;20,931 
Y;21,495;16,662""" 
#after testing replace io.StringIO(temp) to filename 
df = pd.read_csv(io.StringIO(temp), sep=";",thousands=',') 
print df 
    Farm_Name Total Apples Good Apples 
0   EM   18327  14176 
1   EE   18785  14146 
2   IW   635   486 
3   L   33929  24586 
4   NE   12497   9609 
5   NW   30756  23765 
6   SC   8515   6438 
7   SE   22896  17914 
8   SW   11972   9114 
9   WM   27251  20931 
10   Y   21495  16662 
print df.info() 
<class 'pandas.core.frame.DataFrame'> 
RangeIndex: 11 entries, 0 to 10 
Data columns (total 3 columns): 
Farm_Name  11 non-null object 
Total Apples 11 non-null int64 
Good Apples  11 non-null int64 
dtypes: int64(2), object(1) 
memory usage: 336.0+ bytes 
None 
+0

Это сработало, но я должен был добавить это в мою строку read_csv: 'sep = None, thousand = ',', engine = 'python'' Благодарим за помощь @jezrael! – djhc

1

попробовать это:

locale.setlocale(locale.LC_NUMERIC, '') 
df = df[['Farm Name']].join(df[['Total Apples', 'Good Apples']].applymap(locale.atof)) 
+0

Я пробовал это, и появилось это сообщение об ошибке: 'ValueError: ('не удалось преобразовать строку в float: -', u'occurred at index Farm ')' Затем я попытался указать столбец, используя 'df [[2]]. Applymap (locale.atof)' но эта ошибка появилась: 'ValueError: ('неверный литерал для float(): 1,200', u'occurred at index Total Apples ')' – djhc

+0

Можете ли вы разместить выдержку из ваших данных? – Grr

+0

Вы пробовали вызывать 'df ['Total Apples']. Apply (locale.atof)'? – Grr