【问题标题】:Create new column in Pandas Dataframe with position of row in group在 Pandas Dataframe 中创建具有组中行位置的新列
【发布时间】:2020-03-10 15:47:33
【问题描述】:

我想计算一组 Pandas Dataframe 中的一行是否位于组的开头、中间或结尾(该组已排序,其中一列是每组的行索引)。我正在考虑编写一个 UDF 并将其应用于每个组,但我不知道如何迭代组的相关列的行,然后将位置分配给一个新列。

我有以下 UDF:

def add_position_within_group(self,group):
    length_of_group = group['group_index'].max()
    three_lists = self.split_lists_into_three_parts(range(length_of_group))
    for x in group:
        if x["group_index"] in three_lists[0]:
            x["position_in_sequence"] ="start"
        elif x["group_index"] in three_lists[1]:
            x["position_in_sequence"] ="middle"
        elif x["group_index"] in three_lists[2]:
            x["position_in_sequence"] ="end"

我计划在调用 groupby 后应用到每个组,但我不确定“for x in group”是否是迭代组中行的正确方法,或者 x["position_in_sequence"] = “开始”是为该行填充新列的正确方法。

【问题讨论】:

  • 请花时间阅读how to provide a great pandas example 上的这篇文章以及如何提供minimal, complete, and verifiable example 并相应地修改您的问题
  • df['new_col'] = df.groupby('group_name').cumcount()?
  • @anky 我编辑了问题以使其更具体
  • @Quang Hong 我不想要累积计数,而是想要组中行的位置,即“开始”、“中间”或“结束”。我有一个函数可以为我提供这些类别,因此我需要将其应用于每一行并将该行的结果保存在新列中。
  • 你不能从cumcount得到那个吗?

标签: python pandas dataframe group-by


【解决方案1】:

这就是你要找的吗?

import pandas as pd

df = pd.DataFrame([['a'], ['a'], ['a'], ['b'], ['b'], ['a']], columns=['A'])

df['group_index'] = df.groupby('A').cumcount()

输出:

    A   group_index
0   a   0
1   a   1
2   a   2
3   b   0
4   b   1
5   a   3

您始终可以根据 group_index 编号进行进一步计算。

希望有帮助!

【讨论】:

  • 如果您阅读了 cmets,您就会知道这不是我要找的。我已经有了 group_index 列,基于这个列,我正在尝试确定该行是否落在序列的开头、中间或结尾,然后我想保存这个类别(开始、中间或结尾)在新列中
  • 嗨,鲍里斯,似乎有些重要的细节还不清楚。请澄清以下内容,以便我们为您提供最好的帮助: - 您认为开始、中间或结束是什么? (前 33% / 中 33% / 后 33%?或者可能是前 50% 和后 50%,假设它是奇数,中间只有一个元素)
  • 我已经有一个方法,它取列group_index的最大值,并用它来分配列表的一部分给每个索引(self.split_lists_into_three_parts)那部分代码并不重要(我'已经测试过它并且它有效)。我想知道的是如何将此方法应用于每组中的每一行(使用问题中的代码块)并将结果保存在新列中。
猜你喜欢
  • 1970-01-01
  • 2016-02-10
  • 1970-01-01
  • 2017-10-08
  • 2021-12-22
  • 2021-09-20
  • 2022-08-17
  • 2021-11-28
  • 1970-01-01
相关资源
最近更新 更多