2015-04-01 3 views
1

У меня проблемы с пандами, что я немного озадачен. У меня есть файл с большим количеством числовых значений, которые не требуют вычислений. Большинство из них выходят очень хорошо, но у меня есть пара, которая получает «.0», добавленную до конца.Pandas appending .0 to number

Вот пример файла ввода:

Id1   Id2  Age  Id3 
"SN19602","1013743", "24", "23523" 
"SN20077","2567897", "28", "24687" 

И выход генерируется:

Id1   Id2  Age  Id3 
"SN19602","1013743.0", "24", "23523" 
"SN20077","2567897.0", "28", "24687" 

Может кто-нибудь объяснить, почему некоторые, но не все числовые значения получаете +0,0 дописывается, и если я могу предотвратить это? Это проблема, когда я выполняю следующий шаг моего процесса с выходом CSV.

Я попытался преобразовать фрейм данных и сам столбец в строку, но это не повлияло. В идеале я не хочу перечислять каждый конвертируемый столбец, потому что у него очень большое количество столбцов, и он должен вручную пройти через выходной файл, чтобы выяснить, какие из них получают .0 и код для него. Любые предложения оценили.

import pandas as pd 
import csv 

df_inputFile = pd.read_csv("InputFile.csv") 
df_mappingFile = pd.read_csv("MappingFile.csv") 
df_merged = df_inputFile.merge(df_mappingFile, left_on="Id", right_on="Id", how="left") 
#This isn't affecting the output 
df_merged.astype(str) 
df_merged.to_csv("Output.csv", index=False, quoting=csv.QUOTE_ALL) 
+0

У вас есть недостающие значения? если dtype для этого столбца, вероятно, теперь является float64, чтобы справиться с значениями «NaN», пожалуйста, выведите данные из 'df.info() 'вы также можете проверить этот столбец для nulls' np.any (df ['Id2']. isnull()) ' – EdChum

+0

Hi @EdChum - Да, у меня есть значения NaN, и это допустимый сценарий .. которые должны просто оставаться NaN. Спасибо – EMC

ответ

1

pandas.DataFrame.to_csv имеет параметр float_format, который принимает обычную строку с плавающей точкой форматирования. Это должно работать:

df_merged.to_csv("Output.csv", index=False, quoting=csv.QUOTE_ALL, float_format='%.0f') 
+0

Спасибо @Carsten. Я не решался сделать заявление на одеяло для всех полей, если есть некоторые другие, которые нуждаются в точности. В настоящее время он работает в этом конкретном случае использования. – EMC

0

Мне нравится петли. Они медленные, но понятные. Это элегантно для логики, но также позволяет различать форматирование/десятичные знаки для каждого столбца.

Что-то вроде:

final_out = open("Output.txt", 'w') 

for index, row in df.iterrows(): 
    print ('{:.0f}'.format(row['A']), '{:.0f}'.format(row['B']), '{:.0f}'.format(row['C']), , sep=",", file=final_out) 

Я думаю, что лучший/быстрый способ сделать это с чем-то вроде Tabulate или симпатичной принтер.

Сначала преобразуйте вашу dataframe в массив, это очень просто.

array = df.values 

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

final_out = open("Output.txt", 'w') 
from tabulate import tabulate as tb 
print (tb(array, numalign="right", floatfmt=".0f"), file=final_out) 

Вы можете прочитать немного больше о таблицах или хорошем принтере. Выше приведен пример, который поможет вам начать работу.

Как и в предыдущем цикле, табуляция позволяет разделителю, который может быть запятой. https://pypi.python.org/pypi/tabulate at Использование утилиты командной строки.

Довольно уверен, что довольно принтер может сделать это тоже и может быть очень хорошим выбором.


В обоих случаях используется новая печать на питоне. Если вы используете python 2.7, вам понадобится эта небольшая инструкция в качестве вашей первой строки без комментария в вашем скрипте:

from __future__ import print_function