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()
- 将掩码数据帧转换为掩码列表
我正在尝试创建一个新列,其中包含一个 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()
- 将掩码数据帧转换为掩码列表