Как обрабатывать исключения, когда они используются для вычисления другой переменной? - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть этот фрейм данных

letter       amount
a            15
b            5
c            6
d            0
e            12

, затем я использую этот код, чтобы увидеть, сколько раз встречалось письмо

try:
  a = (df.loc['a'])
except:
  print('no a in df')
try:
  b = (df.loc['b'])
except:
  print('no b in df')
try:
  c = (df.loc['c'])
except:
  print('no c in df')
try:
  d = (df.loc['d'])
except:
  print('no d in df')
try:
  e = (df.loc['e'])
except:
  print('no e in df')

amountOfTotalLetters = a + b + c + d + e

, что дает мне name 'd' is not defined как мне сделать такон не использует d для вычисления amountOfTotalLetters?

Я знаю, что функция суммы работает, но я также хочу создать еще один кадр данных позже в коде с помощью:

data = np.array([ a, b, c, d, e])

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

Установите d = 0 в блоке исключений.

try:
  d = (df.loc['d'])
except:
  print('no d in df')
  d = 0

Фактически, вам, вероятно, следует делать это для каждой переменной в случае изменения вашего фрейма данных.

В качестве альтернативы выможет инициализировать все переменные до 0, прежде чем вы начнете проверять наличие.

0 голосов
/ 07 декабря 2018

У вас есть две возможности.Во-первых, ваш подход с прямой индексацией.(Я сжал его в цикл for, чтобы уменьшить код.)

amountOfTotalLetters = 0
for lttr in ('a', 'b', 'c', 'd', 'e'):
    try:
        amountOfTotalLetters += df.loc[lttr]
    except KeyError:
        continue

Преимущество первого решения состоит в том, что вы можете отлавливать ошибку конкретно для каждой буквы или определять общее поведение для ошибки, например *Например, 1004 *.

Во-вторых, следует использовать реализованную функцию суммирования pandas:

amountOfTotalLetters = df.sum()

или, если ваш фрейм данных имеет много столбцов, но вам нужна только одна сумма:

amountOfTotalLetters = df.amount.sum()

Второй подход проще для чтения, быстрее и может использоваться одновременно для многих столбцов.Если вы не хотите обрабатывать ошибки особым образом, я рекомендую использовать второе решение.


По поводу того, что вы добавили в свой вопрос:
Нет ничего проще, чем создать массив изинформационного кадра панд.Вместо явного (и, следовательно, громоздкого и подверженного ошибкам) ​​data = np.array([ a, b, c, d, e]) вы можете легко сделать это:

data = df.values  # If "letter" is your index
# or if letter is also a column:
data = df.amount.values
0 голосов
/ 07 декабря 2018

amountOfTotalLetters = df.amount.sum() Не знаю, пойдете ли вы на это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...