熊猫将CSV中的空单元格识别为EMPTY SPACE,而不是nan

时间:2018-08-16 16:00:36

标签: python pandas csv nan

我有一个读入的数据框,

df = pd.read_csv(r'path\file.csv', encoding = "ISO-8859-1")

这是它的样子,

Machine ID  Machine June    July   August
0   100     ABC      10     12     nan
1   100     ABC      nan    15     15
2   101     CDQ      12            20
3   101     CDQ      15     32     11

和数据类型:

Machine ID  int 64
Machine     object
June        float64
July        object
August      float64

当我尝试groupby时,

machine_group = df.groupby(['Machine ID','Machine'])\['June', 'July', 'August'].sum()\
                    .reset_index() 

我只得到JuneAugust,因为July的空格/字符串为空。

           ID    Machine     June    August 
0         100     ABC        10      15
1         101     CDQ        27      31

因此,我尝试了fllowoing

df = df.apply(pd.to_numeric, errors = 'ignore')

这没有将我的July列转换为数字/ float64。

接下来,我尝试了this

df.replace(r'\s+', np.nan, regex=True)

这也没有用。我的数据框中仍然有空白空间。不知道该怎么办。

我正在阅读此post,似乎与此相反。

如何确定我有nan而不是空字符串?因为July列中的空字符串使该列成为object,并且在groupby子句中不计入汇总。

(我检查了原始的.csv文件和该行的确切位置,它是正常的空单元格,而其他空单元格则以nan的形式读入,而这个特定的空单元格则没有。)

任何建议都会很好。

2 个答案:

答案 0 :(得分:0)

您可以尝试指定列的数据类型,以便所有空白/字符串均为NaN。您可以尝试使用dtypeconverters

df = pd.read_csv(r'path\file.csv', encoding = "ISO-8859-1"
                , dtype={'June': int, 'July':int, 'August':int})

df = pd.read_csv(r'path\file.csv', encoding="ISO-8859-1" , converters={'June': int, 'July':int, 'August':int})

编辑:您还可以尝试numpy dtypes(https://docs.scipy.org/doc/numpy-1.13.0/user/basics.types.html

答案 1 :(得分:0)

我最初的想法是删除July列中具有空格的行。尽管我不想这样做,因为如果我在其他列中具有重大价值,那该怎么办呢?

但是,到目前为止,我只是由于空白而找到了解决方案,Julyobject类型。使用following

df['July'] = pd.to_numeric(df['July'], errors='coerce')

我可以手动转换为float64类型。这样我就可以groupby上班了。

但是,当我在数据帧中读取诸如na_values = ['nan', '']和@Nick Tallant建议的数据时,最好进行处理。不幸的是,他们没有为我工作。