如何按数字进行排序,但使用dtype=object来读取csv文件?

2024-04-19 06:20:12 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑到这一点测试.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 to object,以克服在列中检测混合字符、日期和数字格式的一些问题,因此删除该语句对我不起作用。你知道吗

我以为我可以把序列转换成数字,但似乎行不通。你知道吗

编辑问题,因为评论不允许我使用回车键而不发布评论。。。[啊,发现了很多关于这个功能的长篇大论。轮班工作。]

@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

倒数第二行的空值导致错误“cannot convert float NaN to integer”

我有许多nan(都是空的)需要保存并计算在value\u counts中。你知道吗

其他空单元格在转换为int64时似乎显示为非常大的负数(即-5226413792388707240)。你知道吗

为我的迟钝提前道歉!谢谢你的帮助。你知道吗


Tags: 文件csvtoconvertdataobjectvalue语句
2条回答

在读取后添加一个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

这里的问题是您在任何类型转换之前调用了df上的value_counts,因此您的value_counts索引仍然是object数据类型,即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

相关问题 更多 >