繁体   English   中英

Pandas 应用 function 引用列名

[英]Pandas Apply function referencing column name

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

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

一个班轮后:

所有分类填充

我一直在尝试使用 df.apply 方法进行此操作,但似乎无法正确完成。

数据图片 大致所需的输出(当然有正确的 ASST)

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

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

这是一个超快速(“矢量化”)单行代码:

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 #') - 返回名称中包含Asst #的所有列
  • .eq('x') - 与== 'x'完全相同,它只是更容易链接函数,因为否则会出现括号混乱
  • to_numpy() - 将掩码 dataframe 转换为掩码列表

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

不是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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM