使用Python Pandas将带逗号的字符串转换为数字

时间:2015-06-10 21:04:35

标签: python csv pandas dataframe types

我正在使用pandas Python模块生成数据透视表报告。源数据包括以毫秒为单位测量的大量读数。如果毫秒数超过999,则该CSV文件中的值将包含逗号(例如1,234 = 1.234秒)。

以下是我试图运行报告的方式:

import pandas as pd
import numpy as np

pool_usage = pd.read_csv("c:/foo/ds-dump.csv")

# Add a column to the end that shows you where the data came from
pool_usage["Source File"] = "ds-dump.csv"

report = pool_usage.pivot_table(values=['Average Pool Size', 'Average Usage Time (ms)'], index=['Source File'], aggfunc=np.max)

print(report)

问题是平均使用时间(ms)的dtype是一个对象,因此np.max函数只是将它视为NaN。因此,我从未看到任何大于999的值。

我尝试解决这个问题:

import pandas as pd
import numpy as np

pool_usage = pd.read_csv("c:/foo/ds-dump.csv")

# Add a column to the end that shows you where the data came from
pool_usage["Source File"] = "ds-dump.csv"

# Convert strings to numbers if possible
pool_usage = pool_usage.convert_objects(convert_numeric=True)

report = pool_usage.pivot_table(values=['Average Pool Size', 'Average Usage Time (ms)'], index=['Source File'], aggfunc=np.max)

print(report)

这实际上确实将平均使用时间列的dtype更改为float,但所有大于999的值仍然被视为NaN。

如何将平均使用时间列转换为浮点数,即使某些值可能包含逗号?

1 个答案:

答案 0 :(得分:7)

read_csv函数采用可选的thousands参数。它的默认值为None,因此您可以将其更改为",",以便在读取文件时将其1,234识别为1234

pd.read_csv("c:/foo/ds-dump.csv", thousands=",")

一旦文件被读入内存,保存毫秒值的列应该具有int64数据类型。