我正在使用Pandas组织CSV文件,以便以后使用matplotlib进行绘制。首先,我创建一个熊猫数据框以查找包含“ Pt”的行。这是我搜索用作标题行的内容。 header
然后,在创建要使用的新数据框时,保存此行的索引并将其应用于skiprow参数。
奇怪的是,取决于文件格式,即使找到正确的索引,错误的行也会显示为标题。例如,请注意在Pandas第54行中,该标签后如何具有“ Pt”:
数据框在此处正确显示。 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
我们将不胜感激。
答案 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