Панды не последовательно пропускают входное число строк для аргумента skiprows? - PullRequest
0 голосов
/ 25 января 2019

Я использую Pandas для организации файлов CSV для последующего построения с помощью matplotlib. Сначала я создаю фрейм данных Pandas, чтобы найти строку, содержащую 'Pt'. Это то, что я ищу, чтобы использовать в качестве строки заголовка. заголовок

Затем я сохраняю индекс этой строки и применяю его к аргументу skiprow при создании нового фрейма данных, который я буду использовать.

Как ни странно, в зависимости от формата файла, даже если найден правильный индекс, в качестве заголовка отображается неправильная строка. Например, обратите внимание, что в строке Pandas 54 после вкладки стоит «Pt»:

правильный индекс в первом файле

Датафрейм корректно выводится здесь. правильный кадр данных в первом файле

Для другого файла строка 44 корректно распознается с наличием 'Pt'. правильный индекс для второго файла

Но фрейм данных включает строку 43 в качестве заголовка! неверный фрейм данных во втором файле

Я попытался установить 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. Я не могу поделиться файлами целиком.

file1 (правильно составленный фрейм данных)

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

file2 (кадр данных с неправильным заголовком)

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 голосов
/ 25 января 2019

Вы должны обратить внимание на свой уровень отступов.Ваш кодовый блок, в котором вы хотите установить header_idx в зависимости от вашего условия if any(row.str.contains('Pt')), имеет тот же уровень назначения, что и оператор if, что означает, что он выполняется на каждой итерации цикла for, а не только когда условиеmet.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...