Как объединить несколько фреймов данных в пределах oop, используя python pandas - PullRequest
1 голос
/ 30 января 2020

У меня есть 3 таблицы на каждом листе Excel: sheet1 - Gross, sheet2 - Margin, sheet3 - Revenue

Таким образом, я смог выполнить итерацию по каждому листу и отключить его.

Но как мне их объединить?

enter image description here

    sheet_names = ['Gross','Margin','Revenue']

    full_table = pd.DataFrame()
    for sheet in sheet_names:
        df = pd.read_excel(BudgetData.xlsx', sheet_name = sheet, index=False)
        unpvt = pd.melt(df,id_vars=['Company'], var_name ='Month', value_name = sheet)
# how can I join unpivoted dataframes here?
        print(unpvt)

enter image description here

Желаемый результат:

enter image description here

ОБНОВЛЕНИЕ:

Спасибо @Celius Stingher. Я думаю, что это то, что мне нужно. Это просто дает мне странную сортировку:

enter image description here

и дает мне это предупреждение:

Sorting because non-concatenation axis is not aligned. A future version
of pandas will change to not sort by default.

To accept the future behavior, pass 'sort=False'.

To retain the current behavior and silence the warning, pass 'sort=True'.

  from ipykernel import kernelapp as app

Ответы [ 2 ]

2 голосов
/ 30 января 2020

Так что, похоже, вы делаете поворот, но не сохраняете ни один не развернутый кадр данных в любом месте. Давайте создадим список фреймов данных, в котором будут храниться все неповращенные фреймы данных. Позже мы передадим этот список данных в качестве аргумента для функции pd.concat для выполнения конкатенации.

sheet_names = ['Gross','Margin','Revenue']
list_of_df = []
full_table = pd.DataFrame()
for sheet in sheet_names:
    df = pd.read_excel(BudgetData.xlsx', sheet_name = sheet, index=False)
    df = pd.melt(df,id_vars=['Company'], var_name ='Month', value_name = sheet)
    list_of_df.append(df)

full_df = pd.concat(list_of_df,ignore_index=True)
full_df = full_df.sort_values(['Company','Month'])
print(full_df)

Edit:

Теперь, когда я понимаю, что вам нужно, давайте попробуем другой подход. После l oop попробуйте следующий экземпляр кода pd.concat:

full_df = list_of_df[0].merge(list_of_df[1],on=['Company','Month']).merge(list_of_df[2],on=['Company','Month'])
1 голос
/ 30 января 2020

pd.concat просто соберет все вместе, вы действительно хотите объединить DataFrames, используя pd.merge. Это работает так же, как оператор SQL Join. (основываясь на «желаемом» изображении в вашем посте)

https://pandas.pydata.org/pandas-docs/version/0.19.1/generated/pandas.DataFrame.merge.html

вы просто хотите использовать список столбцов для объединения. Если вы поместите их в аккуратные фреймы данных с теми же именами, что и ваши листы, вы захотите сделать что-то вроде:

gross.merge(margin, on=['Company', 'Month']).merge(revenue, on=['Company', 'Month'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...