[英]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.