【发布时间】:2021-11-18 11:39:30
【问题描述】:
这是一个简单的演示代码。我希望 dtypes as{'a':str, 'b':str, 'c':int, 'd':float},尤其是 str b 被视为输入。
import io
import pandas as pd
s = """a,b,c,d
a1,,1,1.2
a2,00,,3.3
a3,01,3,2.3
a4,10,4,1.3"""
df = pd.read_csv(io.StringIO(s))
df
a b c d
0 a1 NaN 1.0 1.2
1 a2 0.0 NaN 3.3
2 a3 1.0 3.0 2.3
3 a4 10.0 4.0 1.3
不是我所期望的(b 列错误)。
df = pd.read_csv(io.StringIO(s), dtype=str, na_filter=False)
df
a b c d
0 a1 1 1.2
1 a2 00 3.3
2 a3 01 3 2.3
3 a4 10 4 1.3
看起来正确,但在将列 c 转换为 int 或 float 时失败。
df['c'] = df['c'].astype(int)
---------------------------------------------------------
ValueError Traceback (most recent call last)
/tmp/ipykernel_3903327/3842575137.py in <module>
1 df = pd.read_csv(io.StringIO(s), dtype=str, na_filter=False)
----> 2 df['c'] = df['c'].astype('float')
3 #df['d'] = df['d'].astype(float)
4 df
...
ValueError: invalid literal for int() with base 10: ''
下面的代码给出了同样的错误
df = pd.read_csv(io.StringIO(s),
dtype={'a':str, 'b':str, 'c':int, 'd':float},
na_filter=False)
df
【问题讨论】:
-
预期输出是什么? pandas 中没有缺少
int值。如果您想要缺失值,它必须是浮点数,因为NaN是浮点数。如果你希望它是一个空白空间,那么 dtype 必须是 object。 -
如何将空字符串转换为int?
np.int数据类型不允许 NaN,np.float允许。这对我有用:df = pd.read_csv(io.StringIO(s), sep=',', dtype={'a':str, 'b':str, 'c':float, 'd':float}) -
@HenryEcker 我希望 {'a':str, 'b':str, 'c':int, 'd':float}, 所以空 str
'', 零 str'00', '01'应保留为输入。 -
c不能是一个整数,除非你指定应该用什么整数代替空字符串''。如果您不想在b中替换 nan,您将不得不将所有内容读为字符串df = pd.read_csv(io.StringIO(s), dtype=str, na_filter=False)然后转换...或者您可以在之后fillna。但这是对 csv 的大量后期处理。如果我们需要这些无法从文本中推断出的不同 dtype,那么保存 df 的方法可能比保存文本更好。 -
@CodeDifferent 缺失的数值可以用
nan填充。自动日期类型推断(没有指定dtype)是object, float, float, float,但我希望str, str, int, float