python - Pandas Groupby聚合返回自定义输出(不是一行)

标签 python pandas pandas-groupby

我有一个以下格式的数据框

| col1 | col2  | 
|  1   |  day1 |
|  1   |  day2 |
|  1   |  day3 |
|  2   |  day1 | 
|  2   |  day3 | 

我有一个非常定制的逻辑/函数,它适用于 col1 的一个值的单个数据帧,我希望将其应用于所有值。这有点像groupby。然而,我似乎没有得到正确的聚合部分,在我看来,它看起来只返回 1 个值(如 max/min/count/..)。如果我的聚合函数返回一个数据帧且行数超过 1 行怎么办?

例如,预期输出可能是

| col1 | col2       | 
|  1   |  day1-day2 |
|  1   |  day2-day3 |
|  2   |  day1-day3 |

正如您所知,有两行是从 group1 中生成的,一行是从 group2 中生成的。而且聚合逻辑是每两个连续的行串联,甚至更复杂。它有点像 Spark/Hadoop 中的映射缩减想法,但无法在 group.aggregate 中工作...

更新:

人们通常会使用groupby().agg(sum),它的作用是sum返回1行或1个数字。但是,我有一个函数返回一个可能是 0,1 行或多行的数据帧,它肯定会减少行数,但还没有完全折叠到 1 行,就像 groupby().agg(func) 一样,是吗?可以在 groupby.agg 中执行此操作吗?

def func(xdf):
    res = []
    for i in range(len(xdf)-1):
        res.append(xdf.iloc[i] + '-' + xdf.iloc[i+1])
    return pd.DataFrame(res) # return a dataframe, not a number, not a row.

最佳答案

您可以使用groupby.apply,而不是使用groupby.agg,就像这样使用您的数据和函数func,您会得到

print (df.groupby('col1').apply(func))
             col2
col1             
1    0  day1-day2
     1  day2-day3
2    0  day1-day3

为了获得预期的输出格式,您也可以使用reset_index

print (df.groupby('col1').apply(func)
         .reset_index(level=0)
         .reset_index(drop=True))
   col1       col2
0     1  day1-day2
1     1  day2-day3
2     2  day1-day3

​但在您的实际情况下,您可能不需要它

关于python - Pandas Groupby聚合返回自定义输出(不是一行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62733737/

相关文章:

python - 解决 CSV 中无效行的问题

python - python中的散点图groupby列

python - 修改后的随机快速排序 - 不返回

python - 遍历列表字典并返回同一索引处的字符

python - 将原始日期格式转换为 Pandas 日期对象

python - 从数据框中列表内的字典中提取元素

Python Reportlab 合并段落

python - pandas:绘制 DataFrame 时未显示 MultiIndex

python - 用列值更新 pandas groupby group

python - 使用 'if in' 时元素现有标识错误