Как конвертировать float в int в списке в python? - PullRequest
0 голосов
/ 27 марта 2019

У меня проблема с преобразованием float в int в списке python.

Один из элементов списка выглядит так:

{'artForm': 'Madur',
  'artistName': 'Bharati Dolai',
  'gender': 'F',
  'district': 'Paschim Medinipur',
  'phone': '',
  'artisanCard': {'exists': 'N', 'cardNo': ''},
  'dob': '',
  'age': 45.0,
  'year': 1971.0,
  'education': 'I',
  'childrenGoToSchool': 'Y'
}

Я не могу преобразовать age и year в int.

Мой код:

for i in range(len(d)):
    int(d[i]['age'])

И я получаю следующую ошибку

ValueError: cannot convert float NaN to integer

Желаемый вывод:

 {'artForm': 'Madur',
      'artistName': 'Bharati Dolai',
      'gender': 'F',
      'district': 'Paschim Medinipur',
      'phone': '',
      'artisanCard': {'exists': 'N', 'cardNo': ''},
      'dob': '',
      'age': 45,                  #converted to int
      'year': 1971,               #converted to int
      'education': 'I',
      'childrenGoToSchool': 'Y'
    }

Ответы [ 7 ]

1 голос
/ 27 марта 2019

Использование dict comprehension:

import math  

print({k: int(v) if k == 'age' or k == 'year' and not math.isnan(v) else v for k,v in d.items()})

ВЫХОД :

{

 'artForm': 'Madur', 'artistName': 'Bharati Dolai', 'gender': 'F', 
 'district': 'Paschim Medinipur', 'phone': '', 
 'artisanCard': {'exists': 'N', 'cardNo': ''}, 
 'dob': '', 'age': 45, 'year': 1971, 
 'education': 'I', 'childrenGoToSchool': 'Y'

}

РЕДАКТИРОВАТЬ :

Если вынужны только определенные столбцы:

print({k: int(v) for k, v in d.items() if k == 'age' or k == 'year' and not math.isnan(v)})

ВЫХОД :

{'age': 45, 'year': 1971}
1 голос
/ 27 марта 2019

один лайнер

>>> test_dict = {"value1": 111.2, "value2": "asd", "value3": 13.232}
>>> test_dict = {key: int(math.floor(value)) if isinstance(value, float) else value for key, value in test_dict.items()}
>>> test_dict
{'value1': 111, 'value2': 'asd', 'value3': 13}
1 голос
/ 27 марта 2019

У вас есть возраст, который NaNs в вашем списке.Если их невозможно удалить, вы можете попробовать обернуть свой код в оператор try-except:

num_of_nans = 0

for entry in d:
    try:
        entry['age'] = int(entry['age'])
    except ValueError:
        entry['age'] = 'Age not known'
        num_of_nans += 1

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

0 голосов
/ 27 марта 2019

Лучше иметь значение по умолчанию, если свойство отсутствует или неверно. и вам не нужно использовать диапазон для зацикливания списка.

for u in d:
    try:
        u["age"] = int(u["age"])
    except ValueError:
        u["age"] = 0

    try:
        u["year"] = int(u["year"])
    except ValueError:
        u["year"] = 0
0 голосов
/ 27 марта 2019

попробуйте это:

d = {'artForm': 'Madur',
  'artistName': 'Bharati Dolai',
  'gender': 'F',
  'district': 'Paschim Medinipur',
  'phone': '',
  'artisanCard': {'exists': 'N', 'cardNo': ''},
  'dob': '',
  'age': 45.0,
  'year': 1971.0,
  'education': 'I',
  'childrenGoToSchool': 'Y'
}


for i in range(len(d)):
    #convert age to int and replace age
    d['age'] = int(d['age'])
#if you want to convert all the floats to ints:
for k in list(d):#list d to get all the key
    #test is float?
    if isinstance(d[k], float):
        #yes? convert it to int
        d[k] = int(d[k])
    #else pass
    else:
        pass

print(d)
0 голосов
/ 27 марта 2019

Сделайте то же самое в блоке try, поскольку некоторые значения для клавиши 'age' равны NaN:

for i in range(len(d)):
    try:
        d[i]['age'] = int(d[i]['age'])
    except Exception as e1:
        pass

Это также поможет избежать тех случаев, когда клавиша 'age' имеет пустую строку, такую ​​как ''.

0 голосов
/ 27 марта 2019

Некоторые из ваших значений NaN. Также вы пропустили операцию присваивания.

import math
for i in range(len(d)):
    if not math.isnan(d[i]['age']):
        d[i]['age'] = int(d[i]['age'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...