python - pandas如何在 `groupby`之后按顺序添加一列?

标签 python pandas dataframe running-count

我的数据是这样的,我想计算 NDCG 指标

  pid query title  label  predict  prob
0   1     A     a      0        2   0.9
1   1     A     b      2        0   0.8
2   1     A     c      1        2   0.7
3   2     D     d      3        1   0.8
4   2     D     e      4        2   0.9

groupby操作后

each_pid = data.groupby(data['pid']).apply(lambda g: g.sort_values(['predict', 'prob'], ascending=False))

我有一个这样的数据框。

      pid query title  label  predict  prob  score
pid                                               
1   0   1     A     a      0        2   0.9      6
    2   1     A     c      1        2   0.7     18
    1   1     A     b      2        0   0.8     42
2   4   2     D     e      4        2   0.9    186
    3   2     D     d      3        1   0.8     90

现在我想要另一个列名称 weight 其值是根据每个组的顺序如下。

      pid query title  label  predict  prob  score  weight
pid                                               
1   0   1     A     a      0        2   0.9      6    1
    2   1     A     c      1        2   0.7     18    2
    1   1     A     b      2        0   0.8     42    3
2   4   2     D     e      4        2   0.9    186    1
    3   2     D     d      3        1   0.8     90    2

以及如何获取每个组的前2行

      pid query title  label  predict  prob  score  weight
pid                                               
1   0   1     A     a      0        2   0.9      6    1
    2   1     A     c      1        2   0.7     18    2
2   4   2     D     e      4        2   0.9    186    1
    3   2     D     d      3        1   0.8     90    2

有人能帮忙吗?

编辑。感谢@Akshay Kandul 和@Allen 的帮助。代码作为

data = data.groupby(level=0).head(2)
data['weight'] = data.groupby(level=0).cumcount()+1

最佳答案

您可以在索引级别为零的分组上使用 cumcount 函数

each_pid['weight'] = each_pid.groupby(level=[0]).cumcount()

输出

        label  pid  predict  prob query title  weight
pid                                                 
1   0      0    1        2   0.9     A     a       0
    2      1    1        2   0.7     A     c       1
    1      2    1        0   0.8     A     b       2
2   4      4    2        2   0.9     D     e       0
    3      3    2        1   0.8     D     d       1

如果您真的希望它以 1 开头,那么只需这样做:

each_pid['weight'] = each_pid.groupby(level=[0]).cumcount()+1

输出

        label  pid  predict  prob query title  weight
pid                                                 
1   0      0    1        2   0.9     A     a       1
    2      1    1        2   0.7     A     c       2
    1      2    1        0   0.8     A     b       3
2   4      4    2        2   0.9     D     e       1
    3      3    2        1   0.8     D     d       2

如果您需要每个组的前 2 条记录,您可以使用此代码:

print(each_pid.groupby(level=0).head(2))

关于python - pandas如何在 `groupby`之后按顺序添加一列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44689348/

相关文章:

python - Matplotlib 动画不在类内更新

python - 如何在写入名称时选择文件

python - 从几个大型 Pandas 数据帧中有效地提取一些值

python - Pandas groupby 根据列值和组大小份额选择前 N 行

r - 在 R 中处理具有相同 Id(键)列值的多行

python - Twitch API 获取游戏的历史观看人数

python - csv.reader 错误解析文件

Python用前缀分割字符串

python - 带有东方索引且索引等于行值的数据帧到 json

python - Pandas 从每个现有行创建新行