可以用pandas的read_csv读取分类列吗?

izj3ouym  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(115)

我尝试将dtype参数与read_csv作为dtype={n: pandas.Categorical}传递,但这不能正常工作(结果是一个Object). The manual is unclear
可以用pd.read_csv读取分类列吗?

bpsygsoo

bpsygsoo1#

0.19.0版本中,您可以在read_csv中使用参数dtype='category'

data = 'col1,col2,col3\na,b,1\na,b,2\nc,d,3'
df = pd.read_csv(pd.compat.StringIO(data), dtype='category')
print (df)
  col1 col2 col3
0    a    b    1
1    a    b    2
2    c    d    3

print (df.dtypes)
col1    category
col2    category
col3    category
dtype: object

字符串
如果要指定类别列,请使用dtype和字典:

df = pd.read_csv(pd.compat.StringIO(data), dtype={'col1':'category'})
print (df)
  col1 col2  col3
0    a    b     1
1    a    b     2
2    c    d     3

print (df.dtypes)
col1    category
col2      object
col3       int64
dtype: object

8ehkhllq

8ehkhllq2#

这个问题已经发布了8年多了,但是dtype={n: pandas.Categorical}不工作,因为pd.Categorical是一个顶级函数,它将列转换为类别dtype,而不是dtype示例本身。你可以使用pd.CategoricalDtype()

df = pd.read_csv("my_data.csv", dtype=pd.CategoricalDtype())

字符串
对于特定列,例如col1

df = pd.read_csv("my_data.csv", dtype={'col1': pd.CategoricalDtype()})


显式使用dtype示例的优点(相对于传递快捷方式'category')是因为你可以做两件事:

  • 传递特定的类别(某些有效类别可能还不存在于数据中)。这一点尤其重要,因为尝试通过不存在类别的值更改分类列中的值会引发特殊错误:TypeError: Cannot setitem on a Categorical with a new category (b), set the categories first。为了完全防止此错误,您可以在开始时传递类别列表。
  • 指定是否订购

使用@jezrael的答案中的示例,下面的代码演示了一个示例:

import io
data = 'col1,col2,col3\na,b,1\na,b,2\nc,d,3'
df = pd.read_csv(io.StringIO(data), dtype={'col1': pd.CategoricalDtype(categories=['c', 'b', 'a'], ordered=True)})


然后,当我们仔细检查df['col1']时:

df['col1']

0    a
1    a
2    c
Name: col1, dtype: category                # <--- was read in as categorical dtype
Categories (3, object): ['c' < 'b' < 'a']  # <--- 'b' is a category even though it doesn't exist in the column yet

相关问题