Pandas 应用引用列名的函数

Pandas Apply function referencing column name

我正在尝试创建一个新列,其中包含一个 SKU 可能属于的所有分类(Asst 1 - 50)。如果一个 SKU 在相应列中用“x”表示,则它属于一个分类。

脚本需要能够遍历 SKU 列中的行并检查任何 ASST 列中的 'x'。如果它找到一个,将该分类列的名称复制到新创建的“所有分类”列中。

一班后:

我一直在尝试使用 df.apply 方法进行此操作,但我似乎做不对。

def assortment_crunch(row):
    if row == 'x':
        
df['Asst #1'].apply(assortment_crunch):

我的尝试并没有真正说明迭代所有“asst”列的需要以及如何将该列分配给新创建的列。

我不确定这是否是最有效的方法,但你可以试试这个。

不是 apply 到列,而是 apply 到整个 DF 以访问该行。然后您可以遍历每一列并为最后一列建立值:

def make_all_assortments_cell(row):
  assortments_in_row = []

  for i in range(1, 51):
    column_name = f'Asst #{i}'
    if (row[column_name] == 'x').any():
      assortments_in_row.append(row[column_name])

  return ", ".join(assortments_in_row)

df["All Assortments"] = df.apply(make_all_assortments_cell)

认为虽然我还没有测试过,但它会起作用。

这是一个超快的(“矢量化”)one-liner:

asst_cols = df.filter(like='Asst #')
df['All Assortment'] = [', '.join(asst_cols.columns[mask]) for mask in asst_cols.eq('x').to_numpy()]

解释:

  • df.filter(like='Asst #') - returns 名称中包含 Asst # 的所有列
  • .eq('x') - 与 == 'x' 完全相同,只是像这样链接函数更容易,因为否则会出现括号混乱
  • to_numpy() - 将掩码数据帧转换为掩码列表