Одновременная передача нескольких фреймов данных в качестве аргументов пользовательской функции в Python - PullRequest
1 голос
/ 08 ноября 2019

Я создавал эту функцию:

    def stand_col_names(*df_to_stand):
        '''function that allow you to lowercase dataframes columns'''
        df_to_stand.columns = df_to_stand.columns.str.lower()
        return df_to_stand

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

df1,df2,df3,df4 = stand_col_names(df1,df2,df3,df4)

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

При запуске я получаю следующую ошибку:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-20-c4c8e2ccc0f3> in <module>
----> 1 df_target_pm,df_target_sp=stand_col_names(df_target_pm,df_target_sp)

<ipython-input-18-65eb087bc145> in stand_col_names(*df_to_stand)
  1 def stand_col_names(*df_to_stand):
  2     '''function that allow you to lowercase dataframes columns'''
----> 3     df_to_stand.columns = df_to_stand.columns.str.lower()
  4     return df_to_stand

AttributeError: 'tuple' object has no attribute 'columns'

Не могли бы вы мне помочь, пожалуйста?

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

На самом деле, поскольку вы изменяете атрибут DataFrame, вам вообще не нужно ничего возвращать:

def stand_col_names(*df_to_stand):
    '''function that allow you to lowercase dataframes columns'''
    for df in df_to_stand:
        df.columns = df.columns.str.lower()

# to call, just do:
stand_col_names(df1, df2, df3, df4)

Но в целом я согласен с комментарием @ ALollz. Эта функция должна быть для одного Dataframe, и цикл должен существовать снаружи:

def stand_col_names(df):
    df.columns = df.columns.str.lower()

for df in (df1, df2, df3, df4):
    stand_col_names(df)
0 голосов
/ 08 ноября 2019
def stand_col_names(*dataframes):
    for df in dataframes:
        df.columns = df.columns.str.lower()

    return dataframes

Некоторое объяснение. Оператор * (я на самом деле не знаю, как он обычно называется в Python, но в других местах он называется оператором "распространения") собирает все аргументы в кортеж. Цикл for выполняет итерацию по кортежу и изменяет их значения. Затем он возвращает кортеж.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...