Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在使用read_csv时添加小数点_Python_Pandas_Csv - Fatal编程技术网

Python 在使用read_csv时添加小数点

Python 在使用read_csv时添加小数点,python,pandas,csv,Python,Pandas,Csv,我正在处理一些csv文件,并使用pandas将它们转换为数据帧。之后,我使用输入查找要删除的值 我被一个小问题挂住了:对于某些列,它将“.o”添加到列中的值。它只在带有数字的列中执行此操作,所以我猜它将列作为浮点读取。如何防止这种情况发生 真正让我困惑的是,它只发生在几列中,所以我不能完全理解一种模式。我需要切掉“.0”以便可以重新导入它,我觉得从一开始就可以最容易地防止它发生 谢谢 以下是我的代码示例: clientid = int(input('What client ID needs to

我正在处理一些csv文件,并使用pandas将它们转换为数据帧。之后,我使用输入查找要删除的值

我被一个小问题挂住了:对于某些列,它将“.o”添加到列中的值。它只在带有数字的列中执行此操作,所以我猜它将列作为浮点读取。如何防止这种情况发生

真正让我困惑的是,它只发生在几列中,所以我不能完全理解一种模式。我需要切掉“.0”以便可以重新导入它,我觉得从一开始就可以最容易地防止它发生

谢谢

以下是我的代码示例:

clientid = int(input('What client ID needs to be deleted?'))

df1 = pd.read_csv('Client.csv')
clientclean = df1.loc[df1['PersonalID'] != clientid]
clientclean.to_csv('Client.csv', index=None)
理想情况下,我希望所有的值都与原始csv文件相同,但不包含用户输入的clientid行

真正让我困惑的是,它只发生在几列中,所以我不能完全理解一种模式。我需要切掉“.0”以便可以重新导入它,我觉得从一开始就可以最容易地防止它发生


谢谢

如果PersonalID是有问题列的标题,请尝试以下操作:

df1 = pd.read_csv('Client.csv', dtype={'PersonalID':np.int32})
编辑: 因为整数没有NaN值。 您可以在每个有问题的柱上尝试此操作:

df1[col] = df1[col].fillna(-9999) # or 0 or any value you want here
df1[col] = df1[col].astype(int)

您可以遍历每个值,如果它是一个数字
x
,则从中减去
int(x)
,如果此差值不是0.0,则将数字
x
转换为
int(x)
。或者,如果不处理任何非整数,可以将所有数字值转换为
int
s

对于后者的示例(当原始数据不包含任何非整数时):

以前者为例(如果希望将非整数保留为非整数,但希望保证整数保留为整数):


注意,上面的方法不是傻瓜式的:如果碰巧,原始数据集中的非整数列包含所有x.0000000的非整数,一直到小数点后最后一位,则此操作将失败。

这是一个数据类型问题

阿洛兹的评论把我引向了正确的方向。Pandas假设数据类型为float,添加了小数点


我在使用read_csv时将数据类型指定为object(来自Akarius的注释),这解决了问题。

它是字符串
“.o”
,还是作为浮点、十进制
.0
导入?您的描述中不清楚可能使用read\u csv函数的dtype参数就足以解决这个问题了吗?dtype={'PersonalID':np.int32}根本的问题是没有对整数的
np.NaN
支持,因此如果您有一个包含数字和缺少值的列,它们将被强制转换为浮点,
12345
变成
12345.0
。小整数可以用
float64
完美表示,因此不必担心浮点相等比较的不精确性。它是一个浮点。例如,在一列中,一个值是“99”,但在代码中运行后,它转换为“99.0”,可能需要转换为
object
,因为您不能有一个缺少值的
int32
列。它实际上不是PersonalID列。我首先注意到它还有另外两列,都是整数。空值确实出现在这些列中,但您是对的,每个客户端都必须有一个clientid。如果每个客户端都有一个
clientid
,那么
pandas
在读取列时会将该列向下转换为整数。它以浮点形式存在的唯一原因是它无法将列强制转换为整数,但该列具有所有数字类型(以及缺少的)值,这些值可以安全地强制转换为
float
。如果是,是否保留na值?是的,我希望保留na值。我想知道它是否最容易使用。astype(object)将所有collams更改为object,并确保不会遗漏任何内容。
for index, row in df1.iterrows():
    for c, x in enumerate(row):
        if isinstance(x, float):
            df1.iloc[index,c] = int(x)
import numbers
import sys

for c, col in enumerate(df1.columns):
    foundNonInt = False
    for r, index in enumerate(df1.index):
        if isinstance(x, float):
            if (x - int(x) > sys.float_info.epsilon):
                foundNonInt = True
                    break
    if (foundNonInt==False):
        df1.iloc[:,c] = int(df1.iloc[:,c])
    else: