我想将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'
,而无需在导入表后编辑字符串?
答案 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)
由于您的基本问题是导出数据时的输出格式,因此不需要任何操作。只需使用:
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
值不能与整数共存。由于NaN
是float
,因此熊猫会强制进行上投。这很自然,因为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