Importuj kolumnę dataframe pandy jako ciąg bez int

104

Chciałbym zaimportować następujący plik csv jako ciągi, a nie jako int64. Pandy read_csv automatycznie konwertuje go na int64, ale potrzebuję tej kolumny jako ciągu.

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

Niestety użycie konwerterów daje ten sam rezultat.

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
Oliver
źródło
3
Wyraźnie podkreśla problem polegający na tym, że konwertery nie działają. Tak więc, jest to nadal przydatne oprócz powyższego pytania.
Dav Clark,

Odpowiedzi:

158

Chcę tylko powtórzyć, że to zadziała w pandach> = 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

Tworzę również problem dotyczący wykrywania przepełnień całkowitych.

EDYCJA: Zobacz rozdzielczość tutaj: https://github.com/pydata/pandas/issues/2247

Wes McKinney
źródło
14
Wydaje się również, jeśli chcesz, aby wszystkie kolumny powinny być interpretowane jako ciągi znaków, można wykonać następujące czynności: dtype = str.
steveb
Wygląda na to, że puste pola wciąż pojawiają się jako np.nan
Josiah Yoder
1
to samo pytanie tutaj. Ale użyłem keep_default_na = False, rozwiązałem mój problem.
jtcloud
Dziękuję za komentarze. Musiałem również użyć dypte = str AND keep_default_na = False, aby wartości null nie były nan.
Ross117
19

Prawdopodobnie nie jest to najbardziej elegancki sposób, aby to zrobić, ale spełnia swoje zadanie.

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

Po prostu zastąp '/Users/spencerlyon2/Desktop/test.csv'ścieżką do pliku

spencerlyon2
źródło
9

Od pandy 1.0 stało się to znacznie prostsze. Spowoduje to odczytanie kolumny „ID” jako „ciąg znaków”:

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

Jak widać w tym przewodniku dla początkujących , wprowadzono 'string' dtype (zanim łańcuchy były traktowane jako dtype 'object').

Kuffner
źródło