【问题标题】:import str and number columns using pandas使用 pandas 导入 str 和 number 列
【发布时间】: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

标签: python pandas dataframe


【解决方案1】:

该错误是因为常规 int 数据类型不可为空,并且您的数据包含空值。

为了使用可空值,Pandas 有一个extension types。 Int8、Int16、Int32、Int64 是整数类型的扩展,称为Nullable integer data type。空值将替换为类似空的值 (pd.NA)。

要为read_csv 使用这些扩展类型,您可以使用dtype 传递。选择适合您的数据的任何“IntXX”变体。

df = pd.read_csv(io.StringIO(s), header=0, dtype={'a': str, 'b': str, 'c': 'Int32', 'd': float})

您可以稍后使用astype 转换为常规int

df['c'] = df.c.fillna(0).astype(int)

更多可空整数类型的操作,请参考上面的链接。

【讨论】:

    猜你喜欢
    • 2021-12-20
    • 2020-09-23
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 2018-06-18
    相关资源
    最近更新 更多