防止大熊猫“ to_csv”尾随零

时间:2019-05-28 15:08:11

标签: python pandas dataframe d3.js casting

我正在尝试将CS​​V字符串导出到D3 Web应用程序,但是命令to_csv坚持在数据上添加尾随0,以防止D3正确使用。

这是说明问题的最小示例。

我的(简化的)数据框是:

>>> df = pd.DataFrame([['Alex',20.0000, 50.650]],columns=['Name','Age', 'Weight'])
   Name   Age  Weight
0  Alex  20.0   50.65

df['Age']包含一个float,如下所示:

>>> df['Age']
0    20.0
Name: Age, dtype: float64

然后基于此answer,我运行.astype(object)以获得我想要的格式:

>>> df=df.astype(object)
   Name Age Weight
0  Alex  20  50.65

现在,df['Age']包含一个object,且没有尾随零:

>>> df['Age']
0    20
Name: Age, dtype: object

这就是我想使用to_csv导出的内容,但是此命令将尾随数字0附加在后面,我想避免:

>>> df_csv = df.to_csv(sep=',', index = False)
>>> df_csv
'Name,Age,Weight\nAlex,20.0,50.65\n'

我尝试使用基于this answerdf_csv = df.to_csv(sep=',', index = False, float_format='%.0f'),但这是行不通的,因为我的数据框中还有其他浮点数,我希望保留这些浮点数不为零。

如何防止无小数的数字出现尾随0?

4 个答案:

答案 0 :(得分:2)

使用熊猫替换的另一种方法:

df = df.astype(str)
df = df.replace(to_replace = "\.0+$",value = "", regex = True)

这样,您无需导入任何额外的模块。

答案 1 :(得分:0)

您是否尝试过df['Age'] = df['Age'].astype(int)

这让我

    Name    Age     Weight
0   Alex    20  50.65

将列转换为类型object实质上允许该列保留浮点数,整数,字符串等,而仅保留该类型的类型化列。

并将其转换为csv:

df_csv = df.to_csv(sep=',', index = False)

'Name,Age,Weight\r\nAlex,20,50.65\r\n'

答案 2 :(得分:0)

只要您的字符串列中没有空格,这就是一种可行的方法。

to_string()之后使用astype(object),而不是to_csv()。这将保留数字格式,但是将使用空格作为分隔符。只要您在其他任何字段中都没有空格,就可以使用正则表达式将空格转换为逗号。

import re
df = df.astype(object)
df_string = re.sub(" +", ",", df.to_string(index=False))
print(df_string)
#Name,Age,Weight
#Alex,20,50.65

现在将df_string写入文件:

with open('path/to/some/file.csv', 'w') as f:
    f.write(df_string)

答案 3 :(得分:0)

我真的很讨厌Managerpandas.DataFrame.to_string之间的这种差异。但是我通过使用pandas.DataFrame.to_csv将数据复制到新的DataFrame中来挽救数据:

applymap
df_fixed = df.applymap(lambda cell: int(cell) if str(cell).endswith('.0') else cell)

请注意,这不适用于大数(例如10 ** 7),因为它将开始使用e表示法(1e7)