当前位置: 首页 > 知识库问答 >
问题:

如何找到混合类型的输入行

澹台臻
2023-03-14

我在熊猫的一个大csv中阅读:

features = pd.read_csv(filename, header=None, names=['Time','Duration','SrcDevice','DstDevice','Protocol','SrcPort','DstPort','SrcPackets','DstPackets','SrcBytes','DstBytes'], usecols=['Duration','SrcDevice', 'DstDevice', 'Protocol', 'DstPort','SrcPackets','DstPackets','SrcBytes','DstBytes'])

我得到:

sys:1: DtypeWarning: Columns (6) have mixed types. Specify dtype option on import or set low_memory=False.
  %!PS-Adobe-3.0

如何找到输入中导致此警告的第一行?我需要这样做来调试输入文件的问题,输入文件不应该有混合类型。

共有2个答案

施洛城
2023-03-14
for endrow in range(1000, 4000000, 1000):
    startrow = endrow - 1000
    rows = 1000
    try:
        pd.read_csv(filename, dtype={"DstPort": int}, skiprows=startrow, nrows=rows, header=None,
                names=['Time','Duration','SrcDevice','DstDevice','Protocol','SrcPort',
                       'DstPort','SrcPackets','DstPackets','SrcBytes','DstBytes'],
                usecols=['Duration','SrcDevice', 'DstDevice', 'Protocol', 'DstPort',
                         'SrcPackets','DstPackets','SrcBytes','DstBytes'])
    except ValueError:
        print(f"Error is from row {startrow} to row {endrows}")

将文件拆分为多个数据帧,每个数据帧有 1000 行,以查看在哪个行范围内存在导致此问题的混合类型值。

吕峰
2023-03-14

一旦Pandas读完文件,您就无法找出哪些行有问题(请参阅此答案以了解原因)。

这意味着您应该在读取文件时找到一种方法。例如,逐行读取文件,并检查每行的类型,如果其中任何一行与预期类型不匹配,则得到所需的行。

要使用 Pandas 实现此目的,您可以将 chunksize=1 传递给 pd.read_csv() 以块的形式读取文件(在本例中为大小为 N 的数据帧,在本例中为 1)。如果您想了解有关此内容的更多信息,请参阅文档。

代码如下所示:

# read the file in chunks of size 1. This returns a reader rather than a DataFrame
reader = pd.read_csv(filename,chunksize=1)

# get the first chunk (DataFrame), to calculate the "true" expected types
first_row_df = reader.get_chunk()
expected_types = [type(val) for val in first_row_df.iloc[0]] # a list of the expected types.

i = 1 # the current index. Start from 1 because we've already read the first row.
for row_df in reader:
    row_types = [type(val) for val in row_df.iloc[0]]
    if row_types != expected_types:
        print(i) # this row is the wanted one
        break
    i += 1

请注意,这段代码假设第一行具有“true”类型。这段代码真的很慢,所以我建议您实际上只检查您认为有问题的列(尽管这不会带来太多的性能提升)。

 类似资料:
  • 我们有一个DynamoDb表,其中一个列名“createdAt”有时创建为S(String)数据类型,有时创建为N(Number)数据类型。 在我的代码中,如果我定义为String,当我想获取数据时它会失败,它是数字: 如果我定义为Number,当我想获取数据并且它是表中的字符串时失败: 你们有没有人以前也有过同样的问题?应该有办法解决它对吗?并且不能只选择一种数据类型:(

  • 7.4. 混合切面类型 我们完全可以混合使用以下几种风格的切面定义:使用自动代理的@AspectJ 风格的切面,schema-defined <aop:aspect> 的切面,和用 <aop:advisor> 声明的advisor,甚至是使用Spring 1.2风格的代理和拦截器。 由于以上几种风格的切面定义的都使用了相同的底层机制,因此可以很好的共存。

  • 问题 你有一些通用方法,你想把他们包含到很多不同的类中。 解决方案 使用 mixOf 库函数,它会生成一个混合父类。 mixOf = (base, mixins...) -> class Mixed extends base for mixin in mixins by -1 #earlier mixins override later ones for name, method

  • 我有如下数据表示: 我需要在我的C应用程序中访问这些数据。我还需要能够通过可变键名关联地访问项目;例如: A<code>std::vector 我有办法做到这一点吗?我确实更喜欢使用向量和地图,但我对其他解决方案持开放态度,只要我可以关联地访问数据项。 使用这里描述的模板是可行的方法吗?

  • 当参数类型可以混合时,如何使用JSDoc在JavaScript中记录方法? 我有一个对话框对象的方法,我可以显示HTML或我自己的可视对象。JSDoc方法如下所示: 因为JS不允许方法重载,所以我需要创建这些类型的方法,其中方法中的参数可以是两种不同的类型。有没有办法在JSDoc中记录这一点,或者JSDoc只能让你记录一种类型的参数? 另外,您将如何记录类型的参数?也就是说,传入的对象不是类型。准

  • 我很难理解为什么会发生这种错误。我正在将教程移植到最新版本的Spring、Hibernate和WildFly。我从命令行运行,使用Maven构建和测试应用程序。我得到以下错误: 2015年7月10日下午2:18:03 org.springframework.test.context。TestContextManager prepareTestInstance SEVERE:允许TestExecut