繁体   English   中英

熊猫`groupby`似乎只对第一组应用功能

[英]Pandas `groupby` seems to only apply function to first group

我有一个带有词性标签的pandas DataFrame,我正试图用它构建词性标签。 看起来像这样。

silly_df = pd.DataFrame.from_dict({"INDEX":[1, 1, 1, 2, 2, 2, 2, 2], 
                        "LABEL": ['X', 'Y', 'Z', 'Z', 'Z', 'X', 'X', 'Y']})

看起来像:

   INDEX LABEL
0      1     X
1      1     Y
2      1     Z
3      2     Z
4      2     Z
5      2     X
6      2     X
7      2     Y

INDEX列将令牌分组在一起,并且每个令牌都有一个标签。

但是,我想修改标签以改善模型的性能。 我想每个转换"Z"到任何"BZ""IZ" ,其中"BZ"表明我们是在一个(可能长度-1)串的b- eginning Z的,而‘ IZ ’表示我们是在第i n侧(或可能的端部)(长度> 1)的字符串"Z"的。 所有这些转换都应索引内进行 ,以便所需的输出为

   INDEX LABEL  NEW_LABEL
0      1     X          X
1      1     Y          Y
2      1     Z        B_Z
3      2     Z        B_Z
4      2     Z        I_Z
5      2     X          X
6      2     X          X
7      2     Y          Y

我编写了一些代码,以在一个索引级别内的单个标签列表上执行此重新标记操作:

import itertools
def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b)


def add_b_i(beg, inside, match, labels):
    for i, (s, t) in enumerate(pairwise(labels)):
        if t == match:
            if s != match:
                labels[i+1] = beg
            else:
                labels[i+1] = inside
    return labels

现在,我希望将此功能按组应用,但是当我尝试时,我得到:

silly_df.groupby('INDEX')['LABEL'].transform(lambda x: add_b_i('B-Z', 'I-Z', 'Z', x))

输出:

0      X
1      Y
2    B-Z
3      Z
4      Z
5      X
6      X
7      Y

似乎只将功能应用于第一组。 怎么会?

您可以尝试这种矢量化方法((通常,您不需要枚举 Series对象,因为它已经包含索引):

import pandas as pd
import numpy as np

def add_b_i(beg, inside, match, labels):
    match_logic = labels == match
    match_count = match_logic.cumsum()
    return labels.where(~match_logic, 
                        np.where(match_logic & (match_count == 1), beg, inside))

silly_df.groupby('INDEX')['LABEL'].transform(lambda x: add_b_i('B-Z', 'I-Z', 'Z', x))

#0      X
#1      Y
#2    B-Z
#3    B-Z
#4    I-Z
#5      X
#6      X
#7      Y
#Name: LABEL, dtype: object

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM