我读了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()
任何猜测为什么?
由于
中打印数据结构的屏幕答案 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)