Pandas Dataframe将列解释为float而不是String

时间:2018-11-13 12:03:29

标签: python python-3.x pandas dataframe types

我想将csv文件导入到pandas数据框中。有一列具有ID的列,其中仅包含数字,但并非每一行都有ID。

   ID      xyz
0  12345     4.56
1           45.60
2  54231   987.00

我想将此列读为String,但是即使我用

指定了它

df=pd.read_csv(filename,dtype={'ID': str})

我知道

   ID         xyz
0  '12345.0'    4.56
1   NaN        45.60
2  '54231.0'  987.00

是否有一种简便的方法来获取ID作为不带小数的字符串,例如'12345',而无需在导入表后编辑字符串?

3 个答案:

答案 0 :(得分:2)

可能是这样的解决方案,但是在导入df之后:

df = pd.read_csv(filename)
df['ID'] = df['ID'].astype(int).astype(str)

或者因为NaN带有:

df['ID'] = df['ID'].apply(lambda x: x if pd.isnull(x) else str(int(x)))

答案 1 :(得分:1)

如果数值列中没有缺失值,则可能的解决方案-广告参数keep_default_na=False用于不将空值转换为字符串,但不将所有数据(并非总是在第一列中)转换为NaN,还请检查{{3 }}:

import pandas as pd

temp=u"""ID;xyz
0;12345;4.56
1;;45.60
2;54231;987.00"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(pd.compat.StringIO(temp), sep=";", dtype={'ID': str}, keep_default_na=False)
    print (df)
      ID     xyz
0  12345    4.56
1          45.60
2  54231  987.00

编辑:

对我而言,熊猫0.23.4可以完美地解决您的问题,因此这意味着在较低的熊猫版本中存在错误:

import pandas as pd

temp=u"""ID;xyz
0;12345;4.56
1;;45.60
2;54231;987.00"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(pd.compat.StringIO(temp), sep=";", dtype={'ID': str})
print (df)
      ID     xyz
0  12345    4.56
1    NaN   45.60
2  54231  987.00

答案 2 :(得分:0)

在写入csv时指定浮点格式

由于您的基本问题是导出数据时的输出格式,因此不需要任何操作。只需使用:

df.to_csv('file.csv', float_format='%.0f')

由于只希望特定的列具有这种格式,因此可以使用to_string

def format_int(x):
    return f'{x:.0f}' if x==x else ''

with open('file.csv', 'w') as fout:
    fout.write(df.to_string(formatters={'ID': format_int}))

保留数字数据数字

  

有一个ID列,其中仅包含数字

如果您的列仅包含数字,则请勿转换为字符串!。您希望转换为字符串的愿望似乎是XY problem。数字标识符应保留数字。

浮动NaN提示向上投射

您的问题是,{strong>数值系列中的NaN值不能与整数共存。由于NaNfloat,因此熊猫会强制进行上投。这很自然,因为object dtype替代方法效率低下,不建议使用。

如果可行,您可以使用前哨值,例如-1表示空值:

df['ID'] = pd.to_numeric(df['ID'], errors='coerce').fillna(-1).astype(int)

print(df)

      ID     xyz
0  12345    4.56
1     -1   45.60
2  54231  987.00