我有以下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'}})
有人能给我指正确的方向吗?
您可以使用frozenset
到map
的字典值:
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