#python #pandas #function
Вопрос:
У меня есть фрейм данных, подобный этому:
A Status_A Invalid_A
0 Null OR Blank True
1 NaN Null OR Blank True
2 Xv Valid False
Мне нужен такой фрейм данных, как этот:
A Status_A Invalid_A
0 Null OR Blank A True
1 NaN Null OR Blank A True
2 Xv Valid False
Я хочу добавить имя столбца к Status_A
столбцу при создании df
с помощью
def checkNull(ele):
if pd.isna(ele) or (ele == ''):
return ("Null OR Blank", True)
else:
return ("Valid", False)
df[['Status_A', 'Invalid_A']] = df['A'].apply(checkNull).tolist()
Я хочу передать имя столбца в этой функции.
Комментарии:
1. Вам нужно изменить последнюю колонку? Разве вы не пытаетесь просто добавить ко второй колонке?
2. я хочу просто изменить столбец Status_A и только имя столбца в фрейме данных
3.
df.loc[df['Status_A'].isin(['Null OR Blank', '']),'Status_A'] = df['Status_A'] '_A'
?
Ответ №1:
У вас есть несколько вариантов здесь.
Один из вариантов заключается в том, что при создании фрейма данных вы можете передать дополнительные аргументы в pd.Series.apply
:
def checkNull(ele, suffix):
if pd.isna(ele) or (ele ==''):
return (f"Null OR Blank {suffix}", True)
else :
return ("Valid", False)
df[['Status_A', 'Invalid_A']] = df['A'].apply(checkNull, args=('A',)).tolist()
Другой вариант-постобработать фрейм данных, чтобы добавить суффикс
df.loc[df['Invalid_A'], 'Status_A'] = '_A'
При этом оба столбца являются избыточными, что обычно является запахом кода. Вместо этого подумайте о том, чтобы просто использовать логический ряд pd.isna(df['A']) | (df['A'] == '')
в качестве индекса.
Ответ №2:
Более эффективный способ — использовать np.where
df[('Status%s') % '_A'] = np.where((df['A'].isnull()) | (df['A']==''), 'Null or Blank', 'Valid')
df[('Invalid%s') % '_A'] = np.where((df['A'].isnull()) | (df['A']==''), 'True', 'False')
Ответ №3:
Может быть, что-то вроде этого
def append_col_name(df, col_name):
col = f"Status_{col_name}"
df[col] = df[col].apply(lambda x : x " " col_name if x != "Valid" else x)
return df
Затем с вашим df
append_col_name(df, "A")
Ответ №4:
если вы проверяете каждый элемент, вы можете использовать векторизованную операцию и возвращать весь кадр данных, в отличие от работы со столбцом.
def str_col_check(colname : str,
dataframe : pd.DataFrame) -> pd.DataFrame:
suffix = colname.split('_')[-1]
dataframe.loc[df['Status_A'].isin(['Null OR Blank', '']),'Status_A'] = dataframe['Status_A'] '_' suffix
return dataframe