如何使用 pandas.read_csv() 将索引数据读取为字符串?

Posted

技术标签:

【中文标题】如何使用 pandas.read_csv() 将索引数据读取为字符串?【英文标题】:How to read index data as string with pandas.read_csv()? 【发布时间】:2016-05-05 15:33:46 【问题描述】:

我正在尝试使用 pandas 将 csv 文件读取为 DataFrame,并且我想将索引行读取为字符串。但是,由于 index 的行没有任何字符,pandas 将这些数据作为整数处理。怎么读成字符串?

这是我的 csv 文件和代码:

[sample.csv]    
    uid,f1,f2,f3
    01,0.1,1,10
    02,0.2,2,20
    03,0.3,3,30

[code]
df = pd.read_csv('sample.csv', index_col="uid" dtype=float)
print df.index.values

结果:df.index 是整数,不是字符串:

>>> [1 2 3]

但我想获取 df.index 作为字符串:

>>> ['01', '02', '03']

还有一个附加条件:其余的索引数据必须是数值,而且它们实际上太多了,我不能用特定的列名来指向它们。

【问题讨论】:

我不明白“附加条件:索引数据的其余部分必须是数值,它们实际上太多了,我不能用特定的列名来指向它们。” 。您是否只希望行 '01'、'02'、'03' 具有字符串索引,而所有其他行都具有整数? pandas 不支持这一点,每一列只能有一个 dtype,除非你想使用 dtype:'object'。为什么要混合使用字符串和整数索引,这听起来很麻烦? 【参考方案1】:

通过dtype参数指定dtype:

In [159]:
import pandas as pd
import io
t="""uid,f1,f2,f3
01,0.1,1,10
02,0.2,2,20
03,0.3,3,30"""
df = pd.read_csv(io.StringIO(t), dtype='uid':str)
df.set_index('uid', inplace=True)
df.index

Out[159]:
Index(['01', '02', '03'], dtype='object', name='uid')

所以在你的情况下以下应该工作

df = pd.read_csv('sample.csv', dtype='uid':str)
df.set_index('uid', inplace=True)

单行等效项不起作用,因为此处仍然存在出色的pandas bug,其中将被视为索引的列上的 dtype 参数被忽略**:

df = pd.read_csv('sample.csv', dtype='uid':str, index_col='uid')

如果我们假设第一列是索引列,您可以动态执行此操作:

In [171]:
t="""uid,f1,f2,f3
01,0.1,1,10
02,0.2,2,20
03,0.3,3,30"""
cols = pd.read_csv(io.StringIO(t), nrows=1).columns.tolist()
index_col_name = cols[0]
dtypes = dict(zip(cols[1:], [float]* len(cols[1:])))
dtypes[index_col_name] = str
df = pd.read_csv(io.StringIO(t), dtype=dtypes)
df.set_index('uid', inplace=True)
df.info()

<class 'pandas.core.frame.DataFrame'>
Index: 3 entries, 01 to 03
Data columns (total 3 columns):
f1    3 non-null float64
f2    3 non-null float64
f3    3 non-null float64
dtypes: float64(3)
memory usage: 96.0+ bytes

In [172]:
df.index

Out[172]:
Index(['01', '02', '03'], dtype='object', name='uid')

这里我们只读取标题行来获取列名:

cols = pd.read_csv(io.StringIO(t), nrows=1).columns.tolist()

然后我们使用所需的数据类型生成列名的字典:

index_col_name = cols[0]
dtypes = dict(zip(cols[1:], [float]* len(cols[1:])))
dtypes[index_col_name] = str

我们得到索引名称,假设它是第一个条目,然后从其余列中创建一个 dict 并将 float 分配为所需的 dtype 并添加索引 col 指定类型为 str,您可以然后将此作为dtype 参数传递给read_csv

【讨论】:

对不起,我忘了写一些信息。其他列必须是数值,它们实际上太多了,我不能用特定的名称指向它们。所以如果我按照你的方式做,其他数据也是字符串。 我的方法指定了特定列之一,那么问题出在哪里?你不知道名字或者你不想做dtype=str 我想做dtype=float,因为我想强制其他列浮动。 索引col总是第一列吗? 是的。它始终是第一列。【参考方案2】:

如果结果不是字符串,则必须将其转换为字符串。 试试:

result = [str(i) for i in result]

或者在这种情况下:

print([str(i) for i in df.index.values])

【讨论】:

你的方式导致这个结果['1', '2', '3']。我希望是['01', '02', '03']

以上是关于如何使用 pandas.read_csv() 将索引数据读取为字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 pandas.read_csv 读取 csv 文件时将 pandas.dataframe 中的元素转换为 np.float?

如何在使用 pandas.read_csv 读取 csv 文件时将 pandas.dataframe 中的元素转换为 np.float?

如何使用 pandas.read_csv 在双引号之间读取带有千位分隔符的数字 [重复]

如何使用带有 gzip 压缩选项的 pandas read_csv 读取 tar.gz 文件?

pandas.read_csv() 可以在同一列中应用不同的日期格式!这是一个已知的错误吗?如何解决?

Pandas.read_csv 将所有文件读入一列