如何使用dtype = object以数字方式排序read_csv?

时间:2015-07-22 14:00:25

标签: python pandas

鉴于这个简化的test.csv文件:

wrong
8
7
6
3
1
2
4
5
9
10

和这段代码:

#!/usr/bin/python
import pandas as pd

data = pd.read_csv('test.csv', dtype=object)
counts=data['wrong'].value_counts(dropna=False)
counts_converted=counts.convert_objects(convert_numeric=True)

print counts_converted.sort_index()

产生以下输出:

1     1
10    1
2     1
3     1
4     1
5     1
6     1
7     1
8     1
9     1
dtype: int64

为什么最后一个print语句没有对索引1-10进行排序?

我必须在读取csv文件时强制dtype对象,以克服在列中检测混合字符,日期和数字格式的一些问题,因此删除该语句对​​我不起作用。

我认为我可以将系列转换回数字,但它似乎不起作用。

编辑问题,因为评论不允许我在没有发表评论的情况下使用Enter键... [啊,发现很多关于此功能的长期咆哮。 Shift-Enter有效。]

@EdChum建议解决方案适用于简化案例,但不适用于生产数据。考虑一个稍微简单的数据文件:

wrong,right
8,a
7,b
6,c
3,d
1,
2,f
4,g
5,h
9,i
10,j
,k
11,l

倒数第二行的空值导致错误“无法将浮动NaN转换为整数。”

我有很多NaN(全部为空)需要保存并计入value_counts。

其他空单元格在转换为int64时似乎变成非常大的负数(即-5226413792388707240)。

对于我的任何迟钝事先提前道歉!谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

阅读后添加astype会使其排序正确。

你提到你必须整理出一些混合的字符和日期和东西,在astype之前做到这一点,一切都应该没问题。

import pandas as pd

data = pd.read_csv('/home/mikael/test.csv', dtype=object)

# Sanitize your data here

data['wrong'] = data['wrong'].astype(int)
counts=data['wrong'].value_counts(dropna=False)
counts_converted=counts.convert_objects(convert_numeric=True)

print counts_converted.sort_index()

1     1
2     1
3     1
4     1
5     1
6     1
7     1
8     1
9     1
10    1
dtype: int64

答案 1 :(得分:1)

此处的问题是您在进行任何类型转换之前在df上调用了value_counts,因此您的value_counts索引仍然是object dtype,这是str

In [59]:

t="""wrong
8
7
6
3
1
2
4
5
9
10"""
df = pd.read_csv(io.StringIO(t), dtype=object)
counts=df['wrong'].value_counts(dropna=False)
counts.index
Out[59]:
Index(['4', '6', '2', '9', '3', '10', '5', '1', '8', '7'], dtype='object')

调用convert_objects转换的数据不是索引。

如果您将索引类型转换为np.int64,那么它会正确排序:

counts.index = counts.index.astype(np.int64)
counts.sort_index()
Out[74]:
1     1
2     1
3     1
4     1
5     1
6     1
7     1
8     1
9     1
10    1
dtype: int64