не может "преобразовать" столбец pandas в недесятичное целое после объединения - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь сделать что-то чрезвычайно простое, но я довольно плохо знаком с pandas, и я не могу решить это. Я загружаю CSV с несколькими столбцами:

  1. идентификатор
  2. номер дома
  3. улица
  4. город
  5. почтовый индекс

Мне нужно вывести то же самое, но номер дома, улица и город должны быть объединены в один адресный столбец, то есть я выведу:

  1. id
  2. address
  3. почтовый индекс

Мои номера домов составляют целых чисел в CSV , но по какой-то причине, когда я загружаю его в pandas, он преобразует столбец в строку (некоторые значения отсутствуют, это понятно). Мне кажется, что при экспорте или печати числа не могут быть целыми числами, pandas автоматически добавляет к ним десятичную дробь , что невероятно раздражает и бесполезно. Мой адрес становится 33.0 Улица, Город. Что я делаю не так?

import pandas as pd

csv = 'C:\\test\\input.csv'

read = pd.read_csv(csv)

cols = ['id', 'address', 'postcode']
subset = [read['id'], read['house_number'].map(str) + ' ' + read['street'].map(str) + ' ' + read['town'].map(str), read['postcode']]

data = pd.concat(subset, axis=1, keys=cols)

display(data)
data.to_csv('C:\\test\\output.csv')

Любой совет, как сделать так, чтобы эти номера домов оставались номерами домов? Я даже не понимаю, почему pandas добавляет десятичную дробь, если тип столбца автоматически строковый, а не что-либо числовое c.

Спасибо

1 Ответ

1 голос
/ 16 марта 2020

Кажется, что пропущенные значения - это проклятие. Из pandas документации по целочисленным типам обнуляемого типа :

В работе с отсутствующими данными мы увидели, что pandas в основном использует NaN для представления отсутствующих данных. Поскольку NaN - это число с плавающей запятой, это приводит к тому, что массив целых чисел с пропущенными значениями становится плавающей точкой. В некоторых случаях это может не иметь большого значения. Но если ваш целочисленный столбец является, скажем, идентификатором, приведение к float может быть проблематичным c. Некоторые целые числа даже не могут быть представлены в виде чисел с плавающей запятой.

И, похоже, это должно быть полезно для вас:

arr = pd.array([1, 2, None], dtype=pd.Int64Dtype())
pd.Series(arr) ## pd.DataFrame(arr)

Хотя документация предупреждает, что она экспериментальная, и может измениться.

Таким образом, чтобы быть в безопасности, вы, вероятно, захотите вменять значения null, затем приведенные к int и string последовательно!

...