Получить фрейм данных из двух разных функций и записать в два разных листа Excel

#python #excel #pandas #dataframe

#python #excel #pandas #фрейм данных

Вопрос:

Я очень новичок в Python, у меня есть две функции func1 и func2, где у меня есть один фрейм данных в каждой функции. Я бы хотел, чтобы df1 из func1 был записан на листе 1, а df2 из func2 был записан в том же Excel, но на листе 2. Я пробовал индивидуальный excelwriter внутри каждой функции, которая записывает записи, но func2 перезаписывает Df1 с помощью Df2, вот почему я пытаюсь получить оба df снаружи и пытаюсь записать один за другим, поэтому у меня также возникают проблемы с вызовом df вне функции. Я не могу отправить запрос моего проекта, вставив образец запроса, любая помощь / предложение будут оценены. К вашему сведению, этот запрос показывает ошибку.

 import pandas as pd

def func1():

    df1 = pd.DataFrame({'Names': ['Andreas', 'George', 'Steve',
                        'Sarah', 'Joanna', 'Hanna'],
                        'Age':[21, 22, 20, 19, 18, 23]})
                        
    adf1 = return df1                                     

func1()

def func2(df2):

    df2 = pd.DataFrame({'Names': ['Pete', 'Jordan', 'Gustaf',
                    'Sophie', 'Sally', 'Simone'],
                    'Age':[22, 21, 19, 19, 29, 21]})

    adf2 = return df2        
 
func2()      

Filepath='C:/Users/kharikrishnan/xlopt/bb10.xlsx'    
writer= pd.ExcelWriter(Filepath) 

df1.to_excel(writer,sheet_name='Sheet1',index=False,startrow=0, startcol=0) 
df2.to_excel(writer,sheet_name='Sheet2',index=False,startrow=10, startcol=0) 
writer.save() 
writer.close()
  

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

1. Какая ошибка ? поделитесь этим

2. Кажется, что вы не знакомы с переменными в функции, как получить к ним доступ и как работает возврат в конце функции. Я бы посоветовал вам подробнее изучить это, и вы сами получите свой ответ

3. @j Да, я специалист по хранению данных, пытающийся автоматизировать некоторые тесты в нашем проекте, я новичок в программировании, буду работать над их изучением. Спасибо 🙂

Ответ №1:

Не используйте функции, если вы ничего не делаете с фреймами данных внутри них (как в примере). В этом случае попробуйте это:

 df1 = pd.DataFrame({'Names': ['Andreas', 'George', 'Steve',
                              'Sarah', 'Joanna', 'Hanna'],
                    'Age':[21, 22, 20, 19, 18, 23]})
df2 = pd.DataFrame({'Names': ['Pete', 'Jordan', 'Gustaf',
                              'Sophie', 'Sally', 'Simone'],
                    'Age':[22, 21, 19, 19, 29, 21]})

filepath = 'C:/Users/kharikrishnan/xlopt/bb10.xlsx'
writer = pd.ExcelWriter(filepath) 

df1.to_excel(writer,sheet_name='Sheet1',index=False,startrow=0, startcol=0) 
df2.to_excel(writer,sheet_name='Sheet2',index=False,startrow=10, startcol=0) 
writer.save() 
writer.close()
  

[СОВЕТ] Попробуйте использовать имена в нижнем регистре для переменных (не Filepath но filepath ). Больше информации о том, как написать хороший код на Python.


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

 import pandas as pd

df1 = pd.DataFrame({'Names': ['Andreas', 'George', 'Steve',
                              'Sarah', 'Joanna', 'Hanna'],
                    'Age':[21, 22, 20, 19, 18, 23]})
df2 = pd.DataFrame({'Names': ['Pete', 'Jordan', 'Gustaf',
                              'Sophie', 'Sally', 'Simone'],
                    'Age':[22, 21, 19, 19, 29, 21]})


def func1(dataframe):
    # some processes using dataframe, i. e. adding new column:
    dataframe['new_col'] = ['var1', 'var2', 'var3', ]
    return dataframe                                     


def func2(dataframe):
    processed_dataframe = <some another processes using dataframe>
    return processed_dataframe        


new_df1 = func1(df1)
new_df1 = func1(df2)

filepath = 'C:/Users/kharikrishnan/xlopt/bb10.xlsx'    
writer = pd.ExcelWriter(filepath) 

new_df1.to_excel(writer,sheet_name='Sheet1',index=False,startrow=0, startcol=0) 
new_df2.to_excel(writer,sheet_name='Sheet2',index=False,startrow=10, startcol=0) 
writer.save() 
writer.close()
  

Я надеюсь, что это поможет вам. Спрашивайте, если вы чего-то не понимаете.

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

1. Привет, спасибо за ответ, я последую вашему предложению. Это был всего лишь пример кода, причина, по которой мне нужны две функции, потому что я подключаюсь к двум разным базам данных в этих двух функциях, в каждой функции фрейм данных считывает данные из таблицы и хранит содержимое запроса.. Можете ли вы помочь, например, если у меня есть более двух фреймов данных, возвращающихся из двух функций, и распечатать их в Excel, тем временем я ищу, но если вы можете помочь, это было бы здорово, спасибо 🙂

2. @TheKrish0229, то есть в function() : return dataframe1, dataframe2 . Затем: df1, df2 = function() и вы можете использовать его, как и раньше.

Ответ №2:

Вот как вы извлекаете элемент из метода, просто используйте return и сохраните его (после вызова метода) в переменной, которую вы можете использовать после

 def func1():
    return pd.DataFrame({'Names': ['Andreas', 'George', 'Steve',
                                   'Sarah', 'Joanna', 'Hanna'],
                         'Age': [21, 22, 20, 19, 18, 23]})

def func2():
    return pd.DataFrame({'Names': ['Pete', 'Jordan', 'Gustaf',
                                   'Sophie', 'Sally', 'Simone'],
                         'Age': [22, 21, 19, 19, 29, 21]})


df1 = func1()
df2 = func2()

Filepath = 'C:/Users/kharikrishnan/xlopt/bb10.xlsx'
writer = pd.ExcelWriter(Filepath)

df1.to_excel(writer, sheet_name='Sheet1', index=False, startrow=0, startcol=0)
df2.to_excel(writer, sheet_name='Sheet2', index=False, startrow=10, startcol=0)
writer.save()
writer.close()
  

Обратите внимание, что здесь df1 записывается на одном листе, а df2 записывается на другом листе с заполнением 10 строк сверху

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

1. Нет необходимости использовать функции для простого возврата фреймов данных.

2. @maciejwww: Да, вы правы, это фрагмент, показывающий суть моего требования.

3. @maciejwww конечно, это можно было бы встроить, но если бы я это сделал, это не объяснило бы OP, как использовать возвращенный контент из метода 😉