将Pandas数据框中的列作为字符串而非整数导入

142

我希望将以下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个回答

226

只是想再强调,这将在 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 更新,以帮助其他人:
要将所有列都转换为str,可以执行以下操作(来自注释):
pd.read_csv('sample.csv', dtype = 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)

19
如果想要将所有列都解释为字符串,可以使用以下方法:dtype=str - steveb
1
似乎空字段仍然会作为np.nan传递。 - Josiah Yoder
2
同样的问题在这里。但我使用 keep_default_na = False 解决了我的问题。 - jtcloud
1
谢谢评论。我还必须使用dtype=strkeep_default_na=False以便空值不是nan。 - Ross117
使用高位整数作为字符串可以避免很多麻烦。;英雄还是反派?你是英雄!! - Soy César Mora

22

这可能不是最优雅的方法,但它能完成工作。

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'替换为您文件的路径


19

自 pandas 1.0 版本以来,这变得更加直观了。这将按 dtype 'string' 读取列 'ID':

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

正如我们在这个入门指南中所看到的那样,现在已经引入了“string”数据类型(之前字符串被视为“object”数据类型)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接