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

新手上路,请多包涵

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

    ID      xyz
0  12345     4.56
1           45.60
2  54231   987.00

我想将此列作为字符串读取,但即使我用

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' 而无需在导入表后编辑字符串?

原文由 Georg B 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
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)))

原文由 Joe 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果缺失值不在数字列中的可能解决方案 - 广告参数 keep_default_na=False 不将空值转换为字符串,但它不会在所有数据中转换为 NaN,并不总是在第一列中,另请检查 文档

 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

编辑:

对我来说,在 pandas 0.23.4 中完美地工作你的解决方案,所以这意味着在较低的 pandas 版本中存在错误:

 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

原文由 jezrael 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏