[英]Apply function rowwise to pandas dataframe while referencing a column
[英]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_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.