在每行中给定一组项目的情况下检查多个条件,并在新列下指定一个值



我有以下df:

ex_df = pd.DataFrame({'ID': {0: 1, 1: 2, 2: 3, 3: 4}, 'Item': {0: {1}, 1: {1, 2}, 2: {1, 3, 4}, 3: {1, 3}}}) 
  • 当只有项目1时,包1
  • 包2是当有项目1、2时
  • 包3是当有项目1、3、4时
  • 包4是当有项目1、3时

我正试图找到一种方法,在每行中给定一组项目的情况下识别包的类型。

所以结果df应该是:

ex_df = pd.DataFrame({'ID': {0: 1, 1: 2, 2: 3, 3: 4}, 'Item': {0: {1}, 1: {1, 2}, 2: {1, 3, 4}, 3: {1, 3}}, 'Package': {0: 'Package1', 1: 'Package2', 2: 'Package3', 3: 'Package4'}})

有人能给我指正确的方向吗?

您可以使用frozensetmap的字典值:

d = {frozenset({1}): 'Package1',
frozenset({1, 2}): 'Package2',
frozenset({1, 3, 4}): 'Package3',
frozenset({1, 3}): 'Package4'}
ex_df['Package'] = ex_df['Item'].apply(frozenset).map(d)

输出:

ID       Item   Package
0   1        {1}  Package1
1   2     {1, 2}  Package2
2   3  {1, 3, 4}  Package3
3   4     {1, 3}  Package4

可选:如果不匹配,则为最大子集:

ex_df['Package'] = ex_df['Item'].apply(frozenset).map(d)
m = ex_df['Package'].isna()
sets = sorted(d, key=lambda x: -len(x))
ex_df.loc[m, 'Package'] = [d.get(next((s for s in sets if x.issuperset(s)), None))
for x in ex_df.loc[m, 'Item']]

示例:

ID       Item   Package
0   1        {1}  Package1
1   2     {1, 2}  Package2
2   3  {1, 3, 4}  Package3
3   4     {1, 3}  Package4
4   5  {1, 5, 6}  Package1

最新更新