Установите новый столбец с помощью Панд

#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