熊猫能否将groupby汇总成一个列表,而不是总和,平均值等?
问题内容:
我已经成功使用groupby函数按组求和或平均了给定变量,但是有没有一种方法可以汇总到值列表中,而不是得到一个结果?(这是否仍称为聚合?)
我并不完全确定这是我应该采取的方法,因此下面是我想对玩具数据进行转换的示例。
也就是说,如果数据看起来像这样:
A B C
1 10 22
1 12 20
1 11 8
1 10 10
2 11 13
2 12 10
3 14 0
我想要最终得到的是类似以下内容的东西。我不完全确定是否可以通过groupby聚合到列表中来完成此操作,而对于从何处去却不知所措。
假设输出:
A B C New1 New2 New3 New4 New5 New6
1 10 22 12 20 11 8 10 10
2 11 13 12 10
3 14 0
也许我应该追求关键点?数据放入列的顺序无关紧要-在此示例中,所有列B到New6都是等效的。所有建议/更正,不胜感激。
问题答案:
我的解决方案比您预期的要长一些,我敢肯定它可以缩短,但是:
g = df.groupby("A").apply(lambda x: pd.concat((x["B"], x["C"])))
k = g.reset_index()
k["i"] = k1.index
k["rn"] = k1.groupby("A")["i"].rank()
k.pivot_table(rows="A", cols="rn", values=0)
# output
# rn 1 2 3 4 5 6
# A
# 1 10 12 11 22 20 8
# 2 10 11 10 13 NaN NaN
# 3 14 10 NaN NaN NaN NaN
有点解释。第一行,g = df.groupby("A").apply(lambda x: pd.concat((x["B"], x["C"])))
。这一组df
依据A
,然后将列B
和C
放入一列:
A
1 0 10
1 12
2 11
0 22
1 20
2 8
2 3 10
4 11
3 10
4 13
3 5 14
5 10
然后k = g.reset_index()
,创建顺序索引,结果是:
A level_1 0
0 1 0 10
1 1 1 12
2 1 2 11
3 1 0 22
4 1 1 20
5 1 2 8
6 2 3 10
7 2 4 11
8 2 3 10
9 2 4 13
10 3 5 14
11 3 5 10
现在,我想将此索引移到列中(我想听听如何在不重置索引的情况下创建顺序列)k["i"] = k1.index
:
A level_1 0 i
0 1 0 10 0
1 1 1 12 1
2 1 2 11 2
3 1 0 22 3
4 1 1 20 4
5 1 2 8 5
6 2 3 10 6
7 2 4 11 7
8 2 3 10 8
9 2 4 13 9
10 3 5 14 10
11 3 5 10 11
现在,k["rn"] = k1.groupby("A")["i"].rank()
将在每个行内添加row_number
A
(例如row_number() over(partition by A order by i)
在SQL中:
A level_1 0 i rn
0 1 0 10 0 1
1 1 1 12 1 2
2 1 2 11 2 3
3 1 0 22 3 4
4 1 1 20 4 5
5 1 2 8 5 6
6 2 3 10 6 1
7 2 4 11 7 2
8 2 3 10 8 3
9 2 4 13 9 4
10 3 5 14 10 1
11 3 5 10 11 2
最后,只需枢纽k.pivot_table(rows="A", cols="rn", values=0)
:
rn 1 2 3 4 5 6
A
1 10 12 11 22 20 8
2 10 11 10 13 NaN NaN
3 14 10 NaN NaN NaN NaN