将 pandas 数据框列导入为字符串而不是 int
Posted
技术标签:
【中文标题】将 pandas 数据框列导入为字符串而不是 int【英文标题】:Import pandas dataframe column as string not int 【发布时间】:2012-10-28 22:20:39 【问题描述】:我想将以下 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
【问题讨论】:
它清楚地突出了转换器无法工作的问题。所以,除了上面提到的问题,它还是很有用的。 【参考方案1】:只想重申这将适用于 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)
要将大多数或选择性列作为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)
【讨论】:
看来,如果您希望所有列都被解释为字符串,可以执行以下操作:dtype = str
。
看起来空字段仍然以 np.nan 的形式出现
这里有同样的问题。但我用 keep_default_na = False 解决了我的问题。
感谢 cmets。我还必须使用 dypte=str AND keep_default_na = False 以便空值不是 nan。【参考方案2】:
这可能不是最优雅的方式,但它可以完成工作。
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'
替换为您的文件路径
【讨论】:
【参考方案3】:自 pandas 1.0 以来,它变得更加简单。这会将列 'ID' 读取为 dtype 'string':
pd.read_csv('sample.csv',dtype='ID':'string')
正如我们在Getting started guide 中看到的,'string' dtype 已被引入(在字符串被视为 dtype 'object' 之前)。
【讨论】:
以上是关于将 pandas 数据框列导入为字符串而不是 int的主要内容,如果未能解决你的问题,请参考以下文章
Python Pandas:如何将数据框列值设置为 X 轴标签
根据每个句子的第一个单词将 pandas 数据框列中的字符串列表分解为新列
Pandas:如何将数据框列中的“时间戳”值从对象/字符串转换为时间戳?