使用read_csv时添加小数点的Pandas

nx7onnlm  于 2023-01-28  发布在  其他
关注(0)|答案(3)|浏览(170)

我正在处理一些csv文件,并使用panda将它们转换为 Dataframe 。然后,我使用输入来查找要删除的值
我被一个小问题缠住了:对于某些列,它会将. 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",这样我才能重新导入它,我觉得从一开始就防止这种情况发生是最容易的。
谢谢!

lkaoscv7

lkaoscv71#

如果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)
oug3syen

oug3syen2#

你可以遍历每一个值,如果它是一个数字x,就减去int(x),如果差值不为0.0,就把x转换成int(x),或者,如果你不处理任何非整数,就把所有的数字值都转换成int s。
后者的示例(当原始数据不包含任何非整数时):

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:

请注意,上述方法并非万无一失:如果偶然地,来自原始数据集的非整数列包含全部为x.0000000(一直到最后一个小数位)的非整数,则这将失败。

cnwbcb6i

cnwbcb6i3#

这是一个数据类型问题。
Alollz的评论把我引向了正确的方向。Pandas假设了一个浮点型的数据类型,它添加了小数点。
我在使用read_csv时将数据类型指定为object(来自Akarius的注解),这样就解决了这个问题。

相关问题