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