Pandas数据框架-在一个分组中匹配行

3

我有一个数据框,长这样:

       bucket  type   v
0         0    X      14
1         1    X      10
2         1    Y      11
3         1    X      15
4         2    X      16
5         2    Y      9
6         2    Y      10
7         3    Y      20
8         3    X      18
9         3    Y      15
10        3    X      14

期望的输出如下所示:
       bucket  type   v    v_paired
0         1    X      14   nan      (no Y coming before it)
1         1    X      10   nan      (no Y coming before it)
2         1    Y      11   14 (highest X in bucket 1 before this row)
3         1    X      15   11   (lowest Y in bucket 1 before this row)

4         2    X      16   nan (no Y coming before it in the same bucket)
5         2    Y      9    16 (highest X in same bucket coming before)
6         2    Y      10   16 (highest X in same bucket coming before)

7         3    Y      20   nan (no X coming before it in the same bucket)
8         3    X      18   20  (single Y coming before it in same bucket)
9         3    Y      15   18 (single Y coming before it in same bucket)
10        3    X      14   15  (smallest Y coming before it in same bucket)

目标是构建v_paired列,规则如下:
  • 查找在此之前的同一桶内的行,具有相反的类型(X与Y),称这些为“配对候选”

  • 如果当前行是X,则选择配对候选中最小的v以成为当前行的v_paired;如果当前行是Y,则选择配对候选中最大的v以成为当前行的v_paired

提前感谢。
1个回答

0

我认为这应该按顺序完成... 先按桶进行分组

groups = df.groupby('bucket', group_keys=False)

此函数将应用于每个桶组

def func(group):
    y_value = None
    x_value = None
    result = []
    for _, (_, value_type, value) in group.iterrows():
        if value_type == 'X':
            x_value = max(filter(None,(x_value, value)))
            result.append(y_value)
        elif value_type == 'Y':
            y_value = min(filter(None,(y_value, value)))
            result.append(x_value)
    return pd.DataFrame(result)

df['v_paired'] = groups.apply(func)

希望这能完成工作


正确,但没有其他方法...因为您需要保持状态...而且您正在进行分组,这将使事情更快,更易于阅读... - Eyad Sibai
如果没有更好的答案,您能接受我的回答吗? - Eyad Sibai
不,因为有更好的方法。 - Baron Yugovich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接