我正在使用熊猫read_csv。大多数行的最后一列是缺少数据,如下面的示例所示。但是在几行上,数据就在那里。似乎没有将其视为null,而是将其视为NAN。我试图创建一个if语句,以仅显示该列中具有数据的行。
(从美国运通提取的样本到CSV):
2018年1月1日,星期一,“ GOOGLE * SVCSAPPS_NEALW-CC @ GOOGLE.COM,CA”,Neal Walters,XXXX-XXXXXX-XXXXX,“ 4.16”,GOOGLE服务,“ 1600 AMPHITHEATER PKWYMOUNTAIN VIEWCA”,“ 94043-1351美国”,“ 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:必须为实数,而不是str
PART2
同样,第19行没有PAYEE,因为这是付款,而不是费用。
2018年1月26日星期五,20,AUTOPAY PAYMENT-谢谢你,尼尔 Walters,XXXX-XXXXXX-XXXXX ,,-347.52 ,,,'320180260752306017',
我知道这一行在data.head(20)中显示为NaN,所以我想知道如何测试它的null或NaN。当我列出dtypes时,它表明Payee是一个对象(而不是float)。对我来说,这只是一个字符串字段,但我想那是一个对象。
#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:必须为实数,而不是str
问题是如何对单个项目进行If测试,以及为什么对空单元格而不是NaN使用Null会导致不一致。
我也尝试过,但这不会将行显示为NULL(但也不会炸毁)。 如果dfAmexGold ['Payee'] [19]为无: print(“找到一个NULL值”)
答案 0 :(得分:1)
仅显示该列中具有数据的行
仅删除在特定列子集中具有缺失值的行:
data = pd.read_csv(filenameAmexGold, names=colnames, header=None)
data.dropna(subset=['AmexCategory'])
答案 1 :(得分:1)
您可以在缺少值的列上使用pandas.DataFrame.isnull,并通过boolean indexing删除受影响的行:
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())
答案 2 :(得分:0)
不确定这是最好的答案,但就目前而言,它使我向前迈进:
data.fillna('',inplace = True)
Pandas Doc:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.fillna.html
StackOverflow:Get pandas.read_csv to read empty values as empty string instead of nan