Импортировать столбец фрейма данных pandas как строку, а не int

103

Я хотел бы импортировать следующий csv как строки, а не как int64. Pandas read_csv автоматически преобразует его в int64, но мне нужен этот столбец как строка.

ID
00013007854817840016671868
00013007854817840016749251
00013007854817840016754630
00013007854817840016781876
00013007854817840017028824
00013007854817840017963235
00013007854817840018860166


df = read_csv('sample.csv')

df.ID
>>

0   -9223372036854775808
1   -9223372036854775808
2   -9223372036854775808
3   -9223372036854775808
4   -9223372036854775808
5   -9223372036854775808
6   -9223372036854775808
Name: ID

К сожалению, использование конвертеров дает тот же результат.

df = read_csv('sample.csv', converters={'ID': str})
df.ID
>>

0   -9223372036854775808
1   -9223372036854775808
2   -9223372036854775808
3   -9223372036854775808
4   -9223372036854775808
5   -9223372036854775808
6   -9223372036854775808
Name: ID
Оливер
источник
3
Это четко указывает на проблему, при которой конвертеры не работают. Так что это все еще полезно в дополнение к вышеупомянутому вопросу.
Dav Clark

Ответы:

157

Просто хочу повторить, что это будет работать в pandas> = 0.9.1:

In [2]: read_csv('sample.csv', dtype={'ID': object})
Out[2]: 
                           ID
0  00013007854817840016671868
1  00013007854817840016749251
2  00013007854817840016754630
3  00013007854817840016781876
4  00013007854817840017028824
5  00013007854817840017963235
6  00013007854817840018860166

Я также создаю проблему с обнаружением целочисленных переполнений.

РЕДАКТИРОВАТЬ: см. Разрешение здесь: https://github.com/pydata/pandas/issues/2247

Уэс МакКинни
источник
14
Кроме того , кажется, если вы хотите , чтобы все столбцы должны интерпретироваться как строки, можно сделать следующее: dtype = str.
steveb 06
Кажется, пустые поля все еще появляются, как np.nan
Джозия Йодер
1
тот же вопрос здесь. Но я использовал keep_default_na = False, решив мою проблему.
jtcloud
Спасибо за комментарии. Мне также пришлось использовать dypte = str И keep_default_na = False, чтобы нулевые значения не были nan.
Ross117,
19

Это, вероятно, не самый элегантный способ сделать это, но он выполняет свою работу.

In[1]: import numpy as np

In[2]: import pandas as pd

In[3]: df = pd.DataFrame(np.genfromtxt('/Users/spencerlyon2/Desktop/test.csv', dtype=str)[1:], columns=['ID'])

In[4]: df
Out[4]: 
                       ID
0  00013007854817840016671868
1  00013007854817840016749251
2  00013007854817840016754630
3  00013007854817840016781876
4  00013007854817840017028824
5  00013007854817840017963235
6  00013007854817840018860166

Просто замените '/Users/spencerlyon2/Desktop/test.csv'на путь к вашему файлу

spencerlyon2
источник
8

Начиная с pandas 1.0, все стало намного проще. Это будет читать столбец «ID» как dtype «строка»:

pd.read_csv('sample.csv',dtype={'ID':'string'})

Как мы видим в этом руководстве по началу работы, был введен 'string' dtype (до того, как строки обрабатывались как dtype 'object').

Kuffner
источник