我已经成功地使用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我试图得出的结论如下所示。我不完全确定是否可以通过分组聚合成清单来完成这一任务,而且我也不知道从哪里出发。
假设产出:
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列都是等效的。非常感谢所有的建议/更正。
发布于 2013-10-23 08:48:54
我的解决方案比您预期的要长一些,我相信可以缩短,但是:
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 by 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()将在每个A中添加row_number (类似于SQL中的row_number() over(partition by A order by i) ):
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发布于 2015-04-07 20:06:14
我使用了以下方法
grouped = df.groupby('A')
df = grouped.aggregate(lambda x: tuple(x))
df['grouped'] = df['B'] + df['C']发布于 2014-06-09 01:05:46
我正在回答标题和第一句中所述的问题:以下是将价值汇总到清单中的内容:
df.groupby('A').aggregate(lambda tdf: tdf.unique().tolist())下面的简单示例演示了这一点:
import pandas as pd
df = pd.DataFrame( {'A' : [1, 1, 1, 1, 2, 2, 3], 'B' : [10, 12, 11, 10, 11, 12, 14], 'C' : [22, 20, 8, 10, 13, 10, 0]})
print df
df2 = df.groupby('A').aggregate(lambda tdf: tdf.unique().tolist())
print df2
# Old version:
# df2=df.groupby(['A']).apply(lambda tdf: pd.Series( dict([[vv,tdf[vv].unique().tolist()] for vv in tdf if vv not in ['A']]) )) 产出如下:
In [3]: run tmp
A B C
0 1 10 22
1 1 12 20
2 1 11 8
3 1 10 10
4 2 11 13
5 2 12 10
6 3 14 0
[7 rows x 3 columns]
B C
A
1 [10, 12, 11] [22, 20, 8, 10]
2 [11, 12] [13, 10]
3 [14] [0]
[3 rows x 2 columns]https://stackoverflow.com/questions/19530568
复制相似问题