我有一个以下格式的数据框
| 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/