Объединить несколько небольших кадров данных в один большой кадр данных

#python #python-3.x #pandas #dataframe

Вопрос:

Я пытаюсь сделать большой кадр данных из группы меньших DF. поэтому я просмотрел несколько сайтов, и все они упоминают, что нужно использовать этот pd.concat() метод и создать пустой фрейм данных. Я это сделал, однако, когда я печатаю внутри своего цикла for, я все равно получаю данные, как если бы они все еще были разделены по отдельным кадрам данных, и когда я печатаю свой (теперь предположительно заполненный кадр данных), я получаю пустой DF.

Примечание: Все таблицы имеют одинаковую структуру

 import camelot
import pandas as pd


# GETS  73 tables 
pdf_data = camelot.read_pdf('GMCC services 8517404.pdf', flavor='lattice', pages='1', encoding='utf-8' )
all_data = pd.DataFrame()


for info  in pdf_data:

    df= info.df
    # GETTABLE IN  DATAFRAME
    # df = info.df

  # concatenate alltables in one  dataframe 
    # all_data = pd.concat([all_data, df.reset_index(drop=True)])
    master = pd.concat([all_data, df.reset_index(drop=True)])
       
    # CHANGE  COLUMN NAMES  FOR   REAL DATA 
    master = master.rename({0:'product_no',1:'description', 2:'quantity', 3:'net_price', 4:'total'}, axis='columns')

    # GET  SITECODE 
    site = master.iloc[-1, 0]

    # GET FIRST ROW amp;amp; DROP FIRST ROW  OF EVERY TABLE
    master = master.reindex(master.index.drop(0)).reset_index(drop=True)

    # # CREATE  COLUMN  SITE  WITH  SITE CODE
    master['site'] = site

    # Drop LAst ROW on EVERY TABLE
    master.drop(index=master.index[-1], 
        axis=0, 
        inplace=True)

    #    # concatenate alltables in one  dataframe 
    #     all_data = pd.concat([all_data, df.reset_index(drop=True)]) 

    print(master)
# services = all_data.groupby('description')
# unique_sevices = services.apply(lambda x: x['net_price'].unique())


# print(unique_sevices) 
 

что я в настоящее время получаю:

  product_no    |    description     |    quantity    |  net_price    |    site    | 
0 11223        |    Gen desc. 1     |        5       |      19       |    USCA    |
1 22334        |    Gen desc. 2     |        11      |      15       |    USCA    |

 product_no    |    description     |    quantity    |  net_price    |    site    |
0 55667        |    Gen desc. 5     |        10      |      15       |    USNY    |
1 22334        |    Gen desc. 2     |        3       |      11       |    USNY    |
 

Чего я хочу:

  product_no    |    description     |    quantity    |  net_price    |    site    | 
0 11223        |    Gen desc. 1     |        5       |      19       |    USCA    |
1 22334        |    Gen desc. 2     |        11      |      15       |    USCA    |
2 55667        |    Gen desc. 5     |        10      |      15       |    USNY    |
3 22334        |    Gen desc. 2     |        3       |      11       |    USNY    |
 

Ответ №1:

Попробуй:

 all_data = pd.concat([t.df for t in pdf_data], ignore_index=True)
 

Если вы хотите выполнить цикл и изменить свои данные, вы можете собрать их все в список и использовать concat после цикла:

 list_of_df = list()
for table in pdf_data:
    df = table.df.rename({0:'product_no',1:'description', 2:'quantity', 3:'net_price', 4:'total'}, axis=1)
    df["site"] = df.iat[-1, 0]
    df = df[1:-1]
    list_of_df.append(df)

master = pd.concat(list_of_df, ignore_index=True)
 

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

1. Спасибо! это на самом деле создает больший фрейм данных … но как я могу поместить данные после изменений, которые я внес, прежде чем объединить их ?

2. лол. те, которые я пытался сделать в своем цикле for, удаляют первую строку каждого небольшого кадра данных, получая первый столбец последней строки как «сайт» и добавляя новый столбец как сайт с этой информацией и удаляя последнюю строку. поэтому в основном я хотел добавить после всех этих изменений.

3. @victorR — Очень трудно догадаться, не имея фактического образца некоторых имеющихся у вас кадров данных (до внесения изменений). Но я отредактировал свой ответ. Если это не сработает, отредактируйте операцию, чтобы включить несколько примеров. Например pdf_data[0].df.to_dict() , и pdf_data[1].df.to_dict()

4. Спасибо! это помогло. пришлось заменить 2 строки, но сработало !

5. Мне все еще нужно решить еще 2 вопроса. когда camelot импортирует данные из PDF, он создает 2 таблицы, когда таблица охватывает разрыв страницы. знаете ли вы, как я объединяю эти две таблицы в цикле for (без необходимости вручную объединять вручную индексирование ) перед объединением всех небольших кадров данных,?