Панды добавляют пустую строку под заголовком csv-файла?

#python #pandas #csv

#python #pandas #csv

Вопрос:

У меня есть следующий код для создания csv-файлов из таблиц из файла docx:

 from docx import Document
import pandas as pd

document = Document('my_docx.docx')

for index,table in enumerate(document.tables):
    df = [['' for i in range(len(table.columns))] for j in range(len(table.rows))]
    for i, row in enumerate(table.rows):
        for j, cell in enumerate(row.cells):
            df[i][j] = cell.text
            
        name = "tables/table_" str(index) ".csv"
        pd.DataFrame(df).to_csv(name, index=False, header=True)
  

Однако Pandas создает нежелательную пустую строку чуть ниже заголовка таблицы. Это происходит только тогда header=True , когда header=False эта проблема не возникает. Но мне нужен заголовок.

Я полагаю, что есть два способа решить эту проблему. Создайте файл csv с header=True помощью, а затем удалите строку или используйте header=False , а затем добавьте строку в качестве заголовка. Как я могу сделать одно из этих действий?

Комментарии:

1. что вы получаете, когда печатаете df.columns непосредственно перед экспортом?

2. Печать показывает df.iloc[0] и df.columns когда headers=True

3. @teepee Я получаю эту ошибку: AttributeError: объект ‘list’ не имеет атрибута ‘columns’

4. извините, я имею pd.DataFrame(df).columns в виду, что показывает?

5. @RaghavGupta Я получаю аналогичную ошибку: AttributeError: объект ‘list’ не имеет атрибута ‘iloc’

Ответ №1:

Используйте df.drop(0, inplace=True) или df=df.iloc[1:] для удаления первой строки фрейма данных.

Таким образом, общий код будет :-

 from docx import Document
import pandas as pd

document = Document('my_docx.docx')

for index,table in enumerate(document.tables):
    df = [['' for i in range(len(table.columns))] for j in range(len(table.rows))]
    for i, row in enumerate(table.rows):
        for j, cell in enumerate(row.cells):
            df[i][j] = cell.text
            
        name = "tables/table_" str(index) ".csv"
        dataFrame=pd.DataFrame(df)
        dataFrame.drop(0, inplace=True) # Or use dataFrame=dataFrame.iloc[1:]
        dataFrame.to_csv(name, index=False, header=True)