Pandas Dataframe интерпретирует столбцы как плавающие вместо String - PullRequest
0 голосов
/ 13 ноября 2018

Я хочу импортировать CSV-файл в кадр данных Pandas.Существует столбец с идентификаторами, который состоит только из цифр, но не у каждой строки есть идентификатор.

   ID      xyz
0  12345     4.56
1           45.60
2  54231   987.00

Я хочу прочитать этот столбец как строку, но даже если я укажу его с помощью

df=pd.read_csv(filename,dtype={'ID': str})

Я получаю

   ID         xyz
0  '12345.0'    4.56
1   NaN        45.60
2  '54231.0'  987.00

Есть ли простой способ получить идентификатор в виде строки без десятичного знака, например '12345', без необходимости редактировать строки после импорта таблицы?

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

Укажите формат float при записи в csv

Поскольку ваша основная проблема является форматом вывода при экспорте данных, никаких манипуляций не требуется. Просто используйте:

df.to_csv('file.csv', float_format='%.0f')

Поскольку вы хотите, чтобы только определенные столбцы имели это форматирование, вы можете использовать to_string:

def format_int(x):
    return f'{x:.0f}' if x==x else ''

with open('file.csv', 'w') as fout:
    fout.write(df.to_string(formatters={'ID': format_int}))

Сохранить числовые данные в числовом виде

Есть столбец с идентификаторами, который состоит только из цифр

Если ваш столбец содержит только цифры, не преобразуйте в строки! Ваше желание преобразовать в строки кажется XY проблемой . Числовые идентификаторы должны оставаться числовыми.

Float NaN приглашает апскейтинг

Ваша проблема: NaN значения не могут сосуществовать с целыми числами в числовых рядах. Так как NaN является float, Панды выгоняют силы. Это естественно, потому что альтернатива object dtype неэффективна и не рекомендуется.

Если это возможно, вы можете использовать значение часового, например, -1 для обозначения нулей:

df['ID'] = pd.to_numeric(df['ID'], errors='coerce').fillna(-1).astype(int)

print(df)

      ID     xyz
0  12345    4.56
1     -1   45.60
2  54231  987.00
0 голосов
/ 13 ноября 2018

Возможное решение, если пропущенные значения не находятся в числовых столбцах - параметр объявления keep_default_na=False для того, чтобы не преобразовывать пустые значения в строки, но НЕ преобразовывать в NaN во всех данных, не всегда в первом столбце, проверьте также документы :

import pandas as pd

temp=u"""ID;xyz
0;12345;4.56
1;;45.60
2;54231;987.00"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(pd.compat.StringIO(temp), sep=";", dtype={'ID': str}, keep_default_na=False)
    print (df)
      ID     xyz
0  12345    4.56
1          45.60
2  54231  987.00

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

Для меня в пандах 0.23.4 отлично работает ваше решение, так что это означает ошибку в версиях нижних панд:

import pandas as pd

temp=u"""ID;xyz
0;12345;4.56
1;;45.60
2;54231;987.00"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(pd.compat.StringIO(temp), sep=";", dtype={'ID': str})
print (df)
      ID     xyz
0  12345    4.56
1    NaN   45.60
2  54231  987.00
0 голосов
/ 13 ноября 2018

Решением может быть следующее, но после импорта df:

df = pd.read_csv(filename)
df['ID'] = df['ID'].astype(int).astype(str)

Или, поскольку есть NaN с:

df['ID'] = df['ID'].apply(lambda x: x if pd.isnull(x) else str(int(x)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...