นำเข้าคอลัมน์ดาต้าเฟรมของแพนด้าเป็นสตริงไม่ใช่ int


107

ฉันต้องการนำเข้า 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

คำตอบ:


165

แค่อยากจะย้ำอีกครั้งว่าสิ่งนี้ใช้ได้กับแพนด้า> = 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

อัปเดตตามที่ช่วยเหลือผู้อื่น:

หากต้องการให้คอลัมน์ทั้งหมดเป็น str คุณสามารถทำได้ (จากความคิดเห็น):

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

หากต้องการมีคอลัมน์ส่วนใหญ่หรือคอลัมน์ที่เลือกเป็น str คุณสามารถทำได้:

# 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
dtype = strนอกจากนี้ยังดูเหมือนถ้าคุณต้องการคอลัมน์ทั้งหมดจะถูกตีความว่าเป็นเงื่อนไขหนึ่งสามารถทำต่อไปนี้:
steveb

ดูเหมือนว่าช่องว่างยังคงผ่านมาในฐานะ np.nan
Josiah Yoder

2
คำถามเดียวกันที่นี่ แต่ฉันใช้ keep_default_na = False แก้ไขปัญหาของฉัน
jtcloud

ขอบคุณสำหรับคอมเม้น ฉันยังต้องใช้ dypte = str AND keep_default_na = False เพื่อให้ค่า null ไม่ใช่ nan
Ross117

20

นี่อาจไม่ใช่วิธีที่หรูหราที่สุดในการทำ แต่จะทำให้งานสำเร็จลุล่วง

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'ด้วยเส้นทางไปยังไฟล์ของคุณ


11

นับตั้งแต่แพนด้า 1.0 มันตรงไปตรงมามากขึ้น สิ่งนี้จะอ่านคอลัมน์ 'ID' เป็น dtype 'string':

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

ดังที่เราเห็นในคู่มือการเริ่มต้นใช้งานนี้มีการแนะนำ dtype 'string' (ก่อนที่สตริงจะถือว่าเป็น dtype 'object')

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.