获取pandas.read_csv,根据列类型以不同方式处理缺失值

v1l68za4  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(88)

我想读入一个csv文件,并将类似数字的列中的空格视为nan值,将类似字符串的列中的空格视为空字符串。最好我不想提前知道关于列的任何事情。
输入test.csv

StrCol,FloatCol
a,1.0
b,1.1
,1.2
d,
e,1.3

字符串
所需输出DataFrame:

StrCol  FloatCol
0      a       1.0
1      b       1.1
2              1.2
3      d       NaN
4      e       1.3


我在这个案例中找到的代码是

df = pd.read_csv("test.csv")
sc = [c for c, dt in df.dtypes.items() if dt == object]
df.loc[:, sc] = df.loc[:, sc].fillna('')


我只是想知道有没有更优雅的解决方案。对我来说,只有将NaN放在类似数字的列中才是读取csv的直观方式,所以我想知道是否有一个read_csv参数可以给予这种效果。

t5zmwmid

t5zmwmid1#

不幸的是没有如果您想从数据类型的自动检测中获益,则不需要。
如果在数字列中有NaN(或任何字符串),则可以用途:

df = pd.read_csv('test.csv', keep_default_na=False, na_values=['NaN'])

字符串
但是在这里,空字符串对于自动定义数字列很重要。
在您的情况下,这将错误地将所有内容设置为object:

StrCol FloatCol
0      a      1.0
1      b      1.1
2             1.2
3      d         
4      e      1.3

df.dtypes

StrCol      object
FloatCol    object
dtype: object


另一种方法(仍然是相同的逻辑):

out = (pd.read_csv(data)
         .pipe(lambda d: d.combine_first(d.select_dtypes(exclude='number')
                                          .fillna(''))[d.columns])
      )


输出量:

StrCol  FloatCol
0      a       1.0
1      b       1.1
2              1.2
3      d       NaN
4      e       1.3

df.dtypes

StrCol       object
FloatCol    float64
dtype: object

hpcdzsge

hpcdzsge2#

下面是更精确的代码:

import pandas as pd

df = pd.read_csv("test.csv", keep_default_na=False, na_values={'FloatCol': ''})

字符串

相关问题