使用Pandas设置一个新列



我有一个这样的数据帧:

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

当我使用创建df时,我想将列名附加到Status_A

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()

我想在这个函数中传递列名。

这里有几个选项。

一种选择是,当您创建数据帧时,您可以将额外的参数传递给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'] == '')作为索引。

更有效的方法是使用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')

也许有类似的东西

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")

如果检查每个元素,可以使用矢量化操作并返回整个数据帧,而不是对列进行操作。

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

最新更新