【问题标题】:dataframe groupby nth with same behaviour as first and last数据帧 groupby nth 与第一个和最后一个行为相同
【发布时间】:2021-09-21 19:07:54
【问题描述】:

在数据框中,执行 groupby['col'].first() 时,我们会在每列中获得第一个非 nan 值(最后一个相同)。 我试图获得第二个非 nan 值,但我找不到方法。我发现的唯一相关函数是 groupby['col'].nth(1),但如果存在,它只是给了我带有 nans 的第二行。 groupby['col'].nth(1, dropna='any') 没有完成这项工作,因为它跳过带有 nans 的行并且不单独检查每一列。 示例:

df = pd.DataFrame({
    'A': [1, 1, 1, 1, 1],
    'B': [np.nan, 2, 3, 4, 5],
    'C': [np.nan, np.nan, 3, 4, 5]
}, columns=['A', 'B', 'C'])

first() 行为: df.groupby('A').first().reset_index()

结果:

    A   B   C
0   1   2.0 3.0

另一方面: df.groupby('A').nth(0, dropna='any').reset_index() 给出:

    A   B   C
0   1   3.0 3.0

有没有办法在第 n 个函数中获得与第一个/最后一个相同的行为,以便我也可以将它应用于第二个或任何第 n 个项目?

【问题讨论】:

    标签: pandas pandas-groupby


    【解决方案1】:

    您可以使用通用的aggregate 方法用notna 过滤每个系列,然后选择您想要的索引,例如:

    df.groupby('A').aggregate(lambda x: x.array[pd.notna(x)][0])
    

    生产:

         B    C
    A
    1  2.0  3.0
    

    将索引更改为 1 以获得第二个 notna 值给出:

         B    C
    A
    1  3.0  4.0
    

    当然,lambda 有点幼稚,因为如果数组不够长,它会引发IndexError。这样的功能应该可以工作:

    def nth_notna(n):
        def inner(series):
            a = series.array[pd.notna(series)]
            if len(a) - 1 < n:
                return np.nan
            return a[n]
        
        return inner
    

    那么df.groupby('A').aggregate(nth_notna(3))会产生:

         B   C
    A
    1  5.0 NaN
    

    【讨论】:

    • 谢谢,您的回答让我意识到我没有正确地提出我的问题。我现在用一个例子编辑它。
    • 谢谢,这更清楚了。我已经更新了我的答案,希望对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 2016-12-12
    • 2019-03-24
    • 1970-01-01
    • 2022-01-08
    • 2018-01-29
    • 1970-01-01
    相关资源
    最近更新 更多