首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pandas Groupby Aggregate返回自定义输出(不是一行)

Pandas Groupby Aggregate返回自定义输出(不是一行)
EN

Stack Overflow用户
提问于 2020-07-05 03:48:41
回答 2查看 70关注 0票数 2

我有一个如下格式的数据帧

代码语言:javascript
复制
| col1 | col2  | 
|  1   |  day1 |
|  1   |  day2 |
|  1   |  day3 |
|  2   |  day1 | 
|  2   |  day3 | 

我有一个很好的自定义逻辑/函数,它针对col1的一个值在单个数据帧上工作,我希望将该值应用于所有值。它是groupby的一种。然而,我似乎没有得到正确的聚合部分,因为对我来说,它看起来只返回1个值,(如max/min/count/..)。如果我的聚合函数返回一个dataframe并且有超过1行,该怎么办?

例如,预期输出可以是

代码语言:javascript
复制
| col1 | col2       | 
|  1   |  day1-day2 |
|  1   |  day2-day3 |
|  2   |  day1-day3 |

可以看出,group1生成了两行,group2生成了一行。而聚合逻辑是每两个连续的行级联,甚至更复杂。它在Spark/Hadoop中是一种map reduce的想法,但无法在group.aggregate中运行……

更新:

人们通常做groupby().agg( sum ),它的工作方式是sum返回1行或1个数字。然而,我有一个函数可以返回一个数据帧,它可以是0,1或许多行,它确实减少了行数,但还没有折叠到1行,就像groupby().agg(func)一样,在groupby.agg中可以做到吗?

代码语言:javascript
复制
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.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-05 08:43:02

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

代码语言:javascript
复制
print (df.groupby('col1').apply(func))
             col2
col1             
1    0  day1-day2
     1  day2-day3
2    0  day1-day3

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

代码语言:javascript
复制
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

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

票数 2
EN

Stack Overflow用户

发布于 2020-07-05 04:13:36

我想这能带你到你想去的地方。

数据:

代码语言:javascript
复制
df = pd.DataFrame({'col1': [1, 1, 1, 2, 2],
'col2': ['  day1 ', '  day2 ', '  day3 ', '  day1 ', '  day3 '],
'col3': ['  day1 ', '  day2 ', '  day3 ', '  day1 ', '  day3 ']})

按每列分组

代码语言:javascript
复制
gb = df.groupby(['col1', 'col2']).nth(0)

然后再按groupby和dropna

代码语言:javascript
复制
gb.groupby(['col1']).shift(-1).dropna()

哪一项会产生

代码语言:javascript
复制
col1    col2    col3
1     day1    day2 
1     day2    day3 
2     day1    day3 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62733737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档