pandas read_CSV пустой столбец рассматривается как NaN? - PullRequest
0 голосов
/ 01 декабря 2019

Я использую Panda read_csv. Последний столбец в большинстве строк содержит отсутствующие данные, как показано в примере ниже. Но в нескольких строках данные есть. Вместо того, чтобы рассматривать это как ноль, это, кажется, рассматривает это как NAN. Я пытался создать оператор if, чтобы показать только строки, в которых есть данные в этом столбце.

(образец выписки из American Express в CSV):

01/01/2018 понедельник, "GOOGLE * SVCSAPPS_NEALW - CC@GOOGLE.COM, CA", Нил Уолтерс, XXXX-XXXXXX-XXXXX ,,, 4.16 ,,, GOOGLE SERVICES, "1600 AMPHITHEATER 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: должно быть действительным числом, а не str

PART2

Аналогично, в строке 19 отсутствует PAYEE, поскольку это платеж, а не сбор.

01/26/2018, пятница, 20, АВТОПЕЙНАЯ ПЛАТЕЖА - СПАСИБО, Нил Уолтерс, XXXX-XXXXXX-XXXXX ,,, - 347.52 ,,,,,, '320180260752306017',

Я знаю, что эта строка отображается как NaN в data.head (20), поэтому я хочу знать, как проверить ее на ноль или 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: должно быть действительным числом, а не str

Вопрос в том, какделать, если тесты на отдельные элементы, и почему это не согласуется с использованием Null для пустых ячеек вместо NaN.

Я также пытался, но это не показывает строку как NULL (но также не взрывается). если dfAmexGold ['Payee'] [19] равен None: print ("найдено значение NULL")

1 Ответ

1 голос
/ 01 декабря 2019

Вы можете использовать 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())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...