#python #pandas #function #dataframe
#python #pandas #функция #фрейм данных
Вопрос:
Я снова и снова пытаюсь изменить несколько фреймов данных с помощью одних и тех же операций. Я хотел бы поместить все изменения в функцию и просто вызвать функцию с именем фрейма данных и выполнить все преобразования.
Это код и все преобразования, которые я пытаюсь применить сейчас. Когда я запускаю его, ничего не происходит, и фрейм данных остается необработанным.
#create a preprocessing formula so the process can be applied to any dataset (traning and validation and competition)
def preprocessing(df):
#inspect dataframe
df.head()
#check data types in dataframe
np.unique(df.dtypes).tolist()
#inspect shape before removing duplicates
df.shape
#drop duplicates
df = df.drop_duplicates()
#inspect shape again to see change
df.shape
#calculate rows that have a mean of 100 to remove them later
mean100_rows = [i for i in range(len(df)) if df.iloc[i,0:520].values.mean() == 100 ]
#calculate columns that have a mean of 100 to remove them later
mean100_cols = [i for i in np.arange(0,520,1) if df.iloc[:,i].values.mean() == 100 ]
#calculate columns labels that have a mean of 100 to remove them later
col_labels = [df.columns[i] for i in mean100_cols]
#delete rows with mean 100
df.drop(index = mean100_rows, axis=0, inplace=True)
#delete columns with mean 100
df.drop(columns=col_labels, axis=1, inplace=True)
#export columns that have been removed
pd.Series(col_labels).to_csv('remove_cols.csv')
#head
df.head()
#check size again
df.shape
Комментарии:
1. В конце
return df
, затем сделайтеdf = preprocessing(df)
. Фреймы данных предназначеныmutable
для того, чтобы вы могли изменять их внутри функции, ничего не возвращая. Однако я не рекомендую это, и многие операции pandas возвращают новые объекты, так что это приведет к сбою.2. @ALollz Большое вам спасибо, это творит чудеса!
3. Вам также нужно будет добавить
print()
вокруг строк likedf.shape
, иначе вы не увидите результат. Если вы не печатаете эти строки, они ничего не делают и могут быть удалены.
Ответ №1:
В Python объекты передаются функциям по ссылке.
Когда выполняется следующая строка
df = df.drop_duplicates()
Вы в основном назначаете новую ссылку на параметр функции, но объект вне функции не изменяется.
Я бы предложил изменить функцию, чтобы она возвращала объект df, а затем присваивала его возвращаемое значение объекту df вне функции.