大熊猫read_CSV空列被视为NaN?

时间:2019-12-01 18:45:14

标签: python-3.x pandas csv

我正在使用熊猫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值”)

3 个答案:

答案 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