当前位置: 首页 > 面试题库 >

pandas read_csv并使用usecols过滤列

唐焕
2023-03-14
问题内容

我有一个csv文件,pandas.read_csv当我使用过滤列usecols并使用多个索引时,该文件输入不正确。

import pandas as pd
csv = r"""dummy,date,loc,x
   bar,20090101,a,1
   bar,20090102,a,3
   bar,20090103,a,5
   bar,20090101,b,1
   bar,20090102,b,3
   bar,20090103,b,5"""

f = open('foo.csv', 'w')
f.write(csv)
f.close()

df1 = pd.read_csv('foo.csv',
        header=0,
        names=["dummy", "date", "loc", "x"], 
        index_col=["date", "loc"], 
        usecols=["dummy", "date", "loc", "x"],
        parse_dates=["date"])
print df1

# Ignore the dummy columns
df2 = pd.read_csv('foo.csv', 
        index_col=["date", "loc"], 
        usecols=["date", "loc", "x"], # <----------- Changed
        parse_dates=["date"],
        header=0,
        names=["dummy", "date", "loc", "x"])
print df2

我希望df1和df2除了丢失的虚拟列外应该相同,但这些列的标签错误。日期也被解析为日期。

In [118]: %run test.py
               dummy  x
date       loc
2009-01-01 a     bar  1
2009-01-02 a     bar  3
2009-01-03 a     bar  5
2009-01-01 b     bar  1
2009-01-02 b     bar  3
2009-01-03 b     bar  5
              date
date loc
a    1    20090101
     3    20090102
     5    20090103
b    1    20090101
     3    20090102
     5    20090103

使用列号而不是名称给我同样的问题。我可以通过在read_csv步骤之后删除虚拟列来解决此问题,但是我试图了解出了什么问题。我正在使用熊猫0.10.1。

编辑:修复错误的标头用法。


问题答案:

@chip的答案完全错过了两个关键字参数的含义。

  • 名称 是只在必要时有没有头和要指定使用的列名,而不是整数索引等参数。
  • usecols 应该在将整个DataFrame读入内存之前提供过滤器;如果使用得当,则读取后永远不需要删除列。

此解决方案纠正了这些怪异现象:

import pandas as pd
from StringIO import StringIO

csv = r"""dummy,date,loc,x
bar,20090101,a,1
bar,20090102,a,3
bar,20090103,a,5
bar,20090101,b,1
bar,20090102,b,3
bar,20090103,b,5"""

df = pd.read_csv(StringIO(csv),
        header=0,
        index_col=["date", "loc"], 
        usecols=["date", "loc", "x"],
        parse_dates=["date"])

这给了我们:

                x
date       loc
2009-01-01 a    1
2009-01-02 a    3
2009-01-03 a    5
2009-01-01 b    1
2009-01-02 b    3
2009-01-03 b    5


 类似资料:
  • 本文向大家介绍dynamics-crm 使用过滤器过滤API查询,包括了dynamics-crm 使用过滤器过滤API查询的使用技巧和注意事项,需要的朋友参考一下 示例 您可以使用filter属性从CRM检索值的子集。在此示例中,仅返回公司名称等于CompanyName的帐户。            

  • 所有任务都实现了 Chain-of-responsibility 模式并且可以像ASP.NET MVC操作过滤器一样被拦截。 定义过滤器 public class LogEverythingAttribute : JobFilterAttribute, IClientFilter, IServerFilter, IElectStateFilter, IApplyStateFilter {

  • 过滤器可用在任何api或者ng.$rootScoe.Scope的执行过程中,不过一般用来格式化绑定在模板中的表达式。 \{\{ expression | filter \}\} 过滤器一般在处理过程中将数据转变成新的格式。它能使用链式风格,还能接受附加参数。 你可以像下面这样使用链式风格: \{\{ expression | filter1 | filter2 \}\} 你也可以使用“:”来传

  • 问题内容: 如果我有一个对象数组,并且想将Angular模型绑定到基于过滤器的元素之一的属性,该怎么做?我可以用一个具体的例子更好地解释: HTML: 控制器: JSBin:http://jsbin.com/adisax/1/edit 我想将第二个输入过滤为具有’C’等级的主题,但是我不想将模型绑定到该 等级 ;我想将其绑定到等级为“ C”的主题的 标题 。 这可能吗?如果可以,怎么做? 问题答案

  • 问题内容: 在Java程序中,我有一个要基于特定属性过滤的bean列表。 例如,假设我有一个Person列表,一个JavaBean,其中Person具有许多属性,其中包括“名称”。 我也有一个名字列表。 现在,我想查找姓名在姓名列表中的所有人员。 使用Google Guava执行此过滤器的最佳方法是什么? 到目前为止,我已经考虑过将Guava与Apache beanutils结合使用,但这似乎并不

  • 问题内容: 我想使用与列长有关的条件来过滤,这个问题可能很容易,但是我在SO中没有找到任何相关问题。 更具体的,我有一个只有一个,其中,我想过滤使用长度filterer,我拍下面的一个片段。 我阅读了Column的Documentation,但是没有找到任何有用的属性。感谢您的帮助! 问题答案: 在Spark> = 1.5中,您可以使用功能: 在Spark <1.5中,UDF应该可以解决问题: 如