pandas.read_csv中的skiprows参数是否接受可调用函数?

时间:2018-01-30 11:14:46

标签: python pandas

我读了read_csv函数的pandas文档,它说它可以接受skiprows参数的可调用函数。

他们在此列出了https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html)可以使用lambda表达式。但是,当我尝试实现它时,我收到了这个错误:

ValueError:索引名称无效

代码

df = pd.read_csv('student_scores.csv', index_col=['Name', 'ID'], skiprows= (lambda x: x in [0, 2]))
df.head()

任何猜测为什么?

由于

PS。在csv。enter image description here

中打印数据结构的屏幕

1 个答案:

答案 0 :(得分:2)

正在进行的是skiprows = lambda x : x in [0, 2]index_col=['Name', 'ID']的效果的组合。

文件中的第一行包含列名称,但skiprows = lambda x : x in [0, 2]会跳过第一行(,索引为0 )。这样,read_csv无法正确推断列名称,当您指定index_col=['Name', 'ID']时,它会失败,因为它找不到具有该名称的列。

注意:我使用@ jezrael的示例文件作为csv:

temp=u"""Name;ID;val
X;A;100
Y;A;50.5
Z;A;60
E;B;90
F;B;45
G;C;100"""

此:

df = pd.read_csv(pd.compat.StringIO(temp), sep=";", index_col=[0, 1], skiprows= [0, 2])

有效,因为您可以通过位置指定列,避免出现名称问题。

证明:

df = pd.read_csv(pd.compat.StringIO(temp), sep=";", index_col=[0, 1], skiprows= lambda x : x in [1, 2]) # works, not skipping column names' row

df = pd.read_csv(pd.compat.StringIO(temp), sep=";", names=['Name', 'ID', 'val'], index_col=[0, 1], skiprows= ['Name', 'ID']) # works (explicit column naming)