我遇到了大熊猫的问题,我有点困惑。我有一个包含大量数值的文件,不需要计算。他们中的大多数都出来很好,但我有一对将“.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 :(得分:3)
pandas.DataFrame.to_csv
有一个参数float_format
,它接受一个常规的浮点格式化字符串。这应该有效:
df_merged.to_csv("Output.csv", index=False, quoting=csv.QUOTE_ALL, float_format='%.0f')
答案 1 :(得分: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。
非常确定漂亮的打印机也可以做到这一点,并且可能是一个更好的选择。
这两个都使用了新的python打印。如果你使用python 2.7,你将需要这个漂亮的小语句作为你脚本中的第一个非注释行:
from __future__ import print_function