2015-04-01 100 views
1

我遇到了一个熊猫问题,我有点困惑。我有一个文件有很多不需要计算的数值。他们中的大多数都出来很好,但我有一对夫妇得到“.0”结尾。大熊猫追加.0至数字

下面是一个示例输入文件:

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追加,如果有什么办法可以阻止它?当我使用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()'你也可以测试那个列的空值'np.any(df ['Id2']。isnull())' – EdChum 2015-04-01 15:40:54

+0

Hi @EdChum - 是的,我确实有NaN值,这是一个有效的场景。那些应该保持NaN。谢谢 – EMC 2015-04-01 16:01:03

回答

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 2015-04-01 21:22:44

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) 

我认为最好的/更快的方式做到这一点是类似的平板状或漂亮的打印。

首先将您的数据框转换为数组,这很容易。

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) 

你可以在列表或漂亮的打印机上阅读更多。以上是让你入门的上下文示例。

与上面的循环类似,tabulate允许使用可能是逗号的分隔符。 https://pypi.python.org/pypi/tabulate at 使用命令行工具

非常确定漂亮的打印机也可以做到这一点,可能是一个更好的选择。


这两个都使用新的python打印。如果您使用python 2.7,您需要将这个漂亮的小语句作为脚本中的第一个非注释行:

from __future__ import print_function