Pandas read_CSV 空列被视为 NaN?过滤是不是 NAN?
我正在使用 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")
您可以在具有缺失值的列上使用 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())
to show just the rows that have data in that column
只需删除特定列子集中缺少值的行:
data = pd.read_csv(filenameAmexGold, names=colnames, header=None)
data.dropna(subset=['AmexCategory'])
不确定这是否是最好的答案,但现在它让我向前迈进:
data.fillna('',inplace = True)
Pandas Doc: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.fillna.html
StackOverflow: 获取 pandas.read_csv 将空值读取为空字符串而不是 nan