2015-04-01 80 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