熊猫不是始终为skiprows参数跳过输入的行数吗?

时间:2019-01-25 17:30:24

标签: pandas csv dataframe

我正在使用Pandas组织CSV文件,以便以后使用matplotlib进行绘制。首先,我创建一个熊猫数据框以查找包含“ Pt”的行。这是我搜索用作标题行的内容。 header

然后,在创建要使用的新数据框时,保存此行的索引并将其应用于skiprow参数。

奇怪的是,取决于文件格式,即使找到正确的索引,错误的行也会显示为标题。例如,请注意在Pandas第54行中,该标签后如何具有“ Pt”:

correct index on first file

数据框在此处正确显示。 correct dataframe on first file

对于另一个文件,第44行被正确识别为“ Pt”。 correct index on second file

但是数据帧包含第43行作为标题! incorrect dataframe on second file

我尝试设置header = 0,header = none。我想念什么吗?

这是代码

entire_df = pd.read_csv(file_path, header=None)

print(entire_df.head(60))
header_idx = -1
for index, row in entire_df.iterrows(): # find line with desired header
    if any(row.str.contains('Pt')):
        print("Yes! I have pt!")
        print("Header index is: " + str(index))
        print("row contains:")
        print(entire_df.loc[[index]])
        header_idx = index # correct index obtained!
        break

df = pd.read_csv(file_path, delimiter='\t', skiprows=header_idx, header=0) # use line index to exclude extra information above

print(df.head())

这是两个文件中提供不同结果的部分。它们保存为.dta文件。我无法共享整个文件。

文件1 (正确制作的数据框)

FRAMEWORKVERSION    QUANT   7.07    Framework Version
INSTRUMENTVERSION   LABEL   4.32    Instrument Version
CURVE   TABLE   16875
Pt  T   Vf  Im  Vu  Pwr Sig Ach Temp    IERange Over
#   s   V   A   V   W   V   V   deg C   #   bits
0   0.1 3.49916E+000    -1.40364E-002   0.00000E+000    -4.91157E-002   -4.22328E-001   0.00000E+000    1.41995E+003    11  ...........
1   0.2 3.49439E+000    -1.40305E-002   0.00000E+000    -4.90282E-002   -4.22322E-001   0.00000E+000    1.41995E+003    11  ...........
2   0.3 3.49147E+000    -1.40258E-002   0.00000E+000    -4.89705E-002   -4.22322E-001

文件2 (具有错误标题的数据框)

FRAMEWORKVERSION    QUANT   7.07    Framework Version
INSTRUMENTVERSION   LABEL   4.32    Instrument Version
CURVE   TABLE   18
Pt  T   Vf  Vm  Ach Over    Temp
#   s   V vs. Ref.  V   V   bits    deg C
0   2.00833 3.69429E+000    3.69429E+000    0.00000E+000    ........... 1419.95
1   4.01667 3.69428E+000    3.69352E+000    0.00000E+000    ........... 1419.95
2   6.025   3.69419E+000    3.69284E+000    0.00000E+000    ........... 1419.95
3   8.03333 3.69394E+000    3.69211E+000    0.00000E+000    ........... 1419.95

我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

您应该注意缩进级别。您要根据header_idx条件在其中设置if any(row.str.contains('Pt'))的代码块具有与if语句相同的预期级别,这意味着它在for循环的每次迭代中执行,而不仅仅是满足条件时。

for index, row in entire_df.iterrows():
    if any(row.str.contains('Pt')):
    [...]
    header_idx = index

像这样适应缩进以将赋值置于if语句的控制之下:

for index, row in entire_df.iterrows():
    if any(row.str.contains('Pt')):
        [...]
        header_idx = index