鉴于这个简化的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)。
对于我的任何迟钝事先提前道歉!谢谢你的帮助。
答案 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