pandas 如何拆分值并从第一行开始按顺序标记它们,如果重复,则不标记重复

ymdaylpp  于 2023-03-28  发布在  其他
关注(0)|答案(2)|浏览(122)

如何拆分数值,从第一行开始按顺序标记,重复不标记

有一个dataframe有三列:型号、订单、物料

df = pd.DataFrame({'model':['A','A','A','A','A','B','B','B','B','C','C','C','C','C'],
           'order':['aa/ab','aa/ab','aa/ab','aa/ab','aa/ab','ba','ba','ba','ba','ca/cab/cc','ca/cb/cc','ca/cb/cc','ca/cb/cc','ca/cb/cc'],
           'Item':['tissue','paper','tea_spon','chopstick','dish','horse','dog','cat','cat','tv','radio','audio','handphone','recoder']})

order列值,一般为一个but,但也可以组合为两个或多个,这种情况下可以用***"/"***分隔。
例如,***“aa/ab”表示顺序“aa”和顺序“ab”***是组合的。

如果每个模型有1个订单(如ba),我想只显示第一行,并删除其余的,
如果有2个订单(如aa/ab),则第一行只显示第一个订单,第二行只显示第二个订单,如下图所示
如果是3单,可以用同样的规则标注

8qgya5xd

8qgya5xd1#

GroupBy.transform中使用自定义lambda函数来分割值并删除重复项:

f = lambda x: (pd.Series(x.str.split('/').explode().to_numpy()[:len(x)])
                 .mask(lambda x: x.duplicated()))
df['order'] = df.groupby('model')['order'].transform(f)

另一个想法:

f = lambda x: (pd.Series(n:=np.unique([z for y in x for z in y.split('/')]), 
                         index=x.index[:len(n)]).reindex(x.index))
df['order'] = df.groupby('model')['order'].transform(f)

print(df)
   model order       Item
0      A    aa     tissue
1      A    ab      paper
2      A   NaN   tea_spon
3      A   NaN  chopstick
4      A   NaN       dish
5      B    ba      horse
6      B   NaN        dog
7      B   NaN        cat
8      B   NaN        cat
9      C    ca         tv
10     C    cb      radio
11     C    cc      audio
12     C   NaN  handphone
13     C   NaN    recoder
0x6upsns

0x6upsns2#

使用groupby.transform和自定义函数:

def split(g):
    l = g.iloc[0].split('/')
    return pd.Series(l, index=g.index[:len(l)])
    
df['order'] = df.groupby('model')['order'].transform(split)

输出:

model order       Item
0      A    aa     tissue
1      A    ab      paper
2      A   NaN   tea_spon
3      A   NaN  chopstick
4      A   NaN       dish
5      B    ba      horse
6      B   NaN        dog
7      B   NaN        cat
8      B   NaN        cat
9      C    ca         tv
10     C    cb      radio
11     C    cc      audio
12     C   NaN  handphone
13     C   NaN    recoder

相关问题