Pandalar veri çerçevesi sütununu int değil dize olarak içe aktar


107

Aşağıdaki csv'yi int64 olarak değil dizeler olarak içe aktarmak istiyorum. Pandas read_csv bunu otomatik olarak int64'e dönüştürür, ancak bu sütuna dize olarak ihtiyacım var.

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

Maalesef dönüştürücü kullanmak aynı sonucu verir.

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
Dönüştürücülerin çalışmadığı bir sorunu açıkça vurguluyor. Bu nedenle, yukarıda belirtilen soruya ek olarak hala yararlıdır.
Dav Clark

Yanıtlar:


164

Bunun pandalar> = 0.9.1'de işe yarayacağını tekrarlamak istiyorum:

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

Tam sayı taşmalarını tespit etmeyle ilgili de bir sorun oluşturuyorum.

DÜZENLEME: Çözüme buradan bakın: https://github.com/pydata/pandas/issues/2247

Başkalarına yardımcı olacak şekilde güncelleyin:

Sahip olmak tüm sütunları str olarak, bir (yorumun) yapabilirsiniz:

pd.read_csv('sample.csv', dtype = str)

En çok veya seçici sütunlara str olarak sahip olmak için , bunu yapabilirsiniz:

# lst of column names which needs to be string
lst_str_cols = ['prefix', 'serial']
# use dictionary comprehension to make dict of dtypes
dict_dtypes = {x : 'str'  for x in lst_str_cols}
# use dict on dtypes
pd.read_csv('sample.csv', dtype=dict_dtypes)

14
Aynı zamanda tüm sütunları dize olarak yorumlanabilir istiyorsanız, tek aşağıdakileri yapabilirsiniz görünüyor: dtype = str.
steveb

Görünüşe göre boş alanlar hala np.nan olarak geçiyor
Josiah Yoder

2
aynı soru burada. Ama keep_default_na = False kullandım sorunumu çözdü.
jtcloud

Yorumlarınız için teşekkürler. Ayrıca, null değerlerin nan olmaması için dypte = str VE keep_default_na = False kullanmak zorunda kaldım.
Ross117

20

Muhtemelen bunu yapmanın en zarif yolu bu değil, ama işi hallediyor.

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

Sadece değiştir '/Users/spencerlyon2/Desktop/test.csv'Dosyanızın yoluyla


10

Pandalar 1.0'dan bu yana çok daha kolay hale geldi. Bu, 'ID' sütununu dtype 'string' olarak okuyacaktır:

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

Bu Başlarken kılavuzunda görebileceğimiz gibi , 'string' dtype tanıtıldı (dizeler, dtype 'nesne' olarak değerlendirilmeden önce).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.