我有一个如下格式的数据帧
| col1 | col2 |
| 1 | day1 |
| 1 | day2 |
| 1 | day3 |
| 2 | day1 |
| 2 | day3 | 我有一个很好的自定义逻辑/函数,它针对col1的一个值在单个数据帧上工作,我希望将该值应用于所有值。它是groupby的一种。然而,我似乎没有得到正确的聚合部分,因为对我来说,它看起来只返回1个值,(如max/min/count/..)。如果我的聚合函数返回一个dataframe并且有超过1行,该怎么办?
例如,预期输出可以是
| 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中可以做到吗?
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.发布于 2020-07-05 08:43:02
您可以不使用groupby.agg,而是像这样对数据和函数func使用groupby.apply,您将得到
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,但在实际情况中,您可能不需要它
发布于 2020-07-05 04:13:36
我想这能带你到你想去的地方。
数据:
df = pd.DataFrame({'col1': [1, 1, 1, 2, 2],
'col2': [' day1 ', ' day2 ', ' day3 ', ' day1 ', ' day3 '],
'col3': [' day1 ', ' day2 ', ' day3 ', ' day1 ', ' day3 ']})按每列分组
gb = df.groupby(['col1', 'col2']).nth(0)然后再按groupby和dropna
gb.groupby(['col1']).shift(-1).dropna()哪一项会产生
col1 col2 col3
1 day1 day2
1 day2 day3
2 day1 day3 https://stackoverflow.com/questions/62733737
复制相似问题