簡體   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