开发者问题收集

Pandas read_CSV 空列被视为 NaN?过滤是不是 NAN?

2019-12-01
3672

我正在使用 Panda read_csv。大多数行的最后一列缺少数据,如下面的示例所示。但在几行上,数据在那里。它似乎没有将其视为空值,而是将其视为 NAN。我试图创建一个 if 语句来仅显示该列中包含数据的行。

(从美国运通提取到 CSV 的示例):

01/01/2018 Mon,,"GOOGLE *SVCSAPPS_NEALW - [email protected] , CA",Neal Walters,XXXX-XXXXXX-XXXXX,,,4.16,,,GOOGLE SERVICES,"1600 AMPHITHEATRE PKWYMOUNTAIN VIEWCA","94043-1351UNITED STATES",'320180020394601453',

colnames=['DateTime', 'NotUsed2', 'PayeeLong', 'NotUsed4', 'NotUsed5', 'NotUsed6', 'NotUsed7', 'Amount', 'NotUsed9',
          'NotUsed10', 'Payee', 'PayeeAddress', 'PayeeCountry', 'NotUsedX', 'AmexCategory']
data = pd.read_csv(filenameAmexGold, names=colnames, header=None)
# Preview the first 5 lines of the loaded data
print (data.head())

for j in range(len(data)):
    #if not(math.isnan(data['AmexCategory'][j])):
    #    if data['AmexCategory'][j] > ' ':
            print("Row ", j, data['DateTime'][j], data['Payee'][j], data['Amount'][j],
                 "AmexCat=", data['AmexCategory'][j],
                 "PayeeLong=", data['PayeeLong'][j] )

data.head 的示例输出...

          DateTime  NotUsed2  ...              NotUsedX AmexCategory
0  01/01/2018  Mon       NaN  ...  '320180021453'          NaN
1  01/02/2018  Tue       NaN  ...  '320180035375'          NaN
2  01/04/2018  Thu       NaN  ...  '320180043184'          NaN
3  01/08/2018  Mon       NaN  ...  '320180080899'   'Software'
4  01/13/2018  Sat       NaN  ...  '320180133142'          NaN

当我包含两个注释掉的 if 语句时,我收到此错误:

TypeError: must be real number, not str

第 2 部分

同样,第 19 行没有 PAYEE,因为它是付款,而不是收费。

01/26/2018 Fri,20,AUTOPAY PAYMENT - THANK YOU,Neal Walters,XXXX-XXXXXX-XXXXX,,,-347.52,,,,,,'320180260752306017',

我知道此行在 data.head(20) 中显示为 NaN,因此我想知道如何测试它是否为 null 或 NaN。当我列出 dtypes 时,它显示 Payee 是一个对象(而不是浮点数)。对我来说,它只是一个字符串字段,但我猜那是一个对象。

#This test works 
print("Test2", dfAmexGold['Payee'][19])
if (math.isnan( dfAmexGold['Payee'][19])):
   print("found a NAN value")

print("Test1", dfAmexGold['Payee'][20])
if (math.isnan( dfAmexGold['Payee'][20])):
   print("found a NAN value")

第 20 行的测试因以下原因而失败:

TypeError: must be real number, not str

问题是如何对单个项目进行 If 测试,以及为什么使用 Null 而不是 NaN 作为空单元格不一致。

我也试过了,但这并没有将该行显示为 NULL(但也没有崩溃)。 if dfAmexGold['Payee'][19] is None: print("found a NULL value")

3个回答

您可以在具有缺失值的列上使用 pandas.DataFrame.isnull ,并通过 布尔索引 删除受影响的行:

colnames=['DateTime', 'NotUsed2', 'PayeeLong', 'NotUsed4', 'NotUsed5', 'NotUsed6', 'NotUsed7', 'Amount', 'NotUsed9',
          'NotUsed10', 'Payee', 'PayeeAddress', 'PayeeCountry', 'NotUsedX', 'AmexCategory']

data = pd.read_csv(filenameAmexGold, names=colnames, header=None)

data = data[~data['AmexCategory'].isnull()]

print(data.head())
tmsss
2019-12-01

to show just the rows that have data in that column

只需删除特定列子集中缺少值的行:

data = pd.read_csv(filenameAmexGold, names=colnames, header=None)
data.dropna(subset=['AmexCategory'])
RomanPerekhrest
2019-12-01

不确定这是否是最好的答案,但现在它让我向前迈进:

data.fillna('',inplace = True)

Pandas Doc: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.fillna.html

StackOverflow: 获取 pandas.read_csv 将空值读取为空字符串而不是 nan

NealWalters
2019-12-01