首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫能不能按照一份清单而不是总和、平均数等进行分类呢?

熊猫能不能按照一份清单而不是总和、平均数等进行分类呢?
EN

Stack Overflow用户
提问于 2013-10-23 00:14:15
回答 7查看 95.4K关注 0票数 72

我已经成功地使用groupby函数按组对给定变量进行求和或平均,但是是否有一种方法可以聚合成一个值列表,而不是得到一个结果呢?(这是否仍被称为聚合?)

我不完全确定这是我应该采取的方法,所以下面是一个我想用玩具数据进行转换的例子。

也就是说,如果数据如下所示:

代码语言:javascript
复制
    A    B    C  
    1    10   22
    1    12   20
    1    11   8
    1    10   10
    2    11   13
    2    12   10 
    3    14   0

我试图得出的结论如下所示。我不完全确定是否可以通过分组聚合成清单来完成这一任务,而且我也不知道从哪里出发。

假设产出:

代码语言:javascript
复制
     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列都是等效的。非常感谢所有的建议/更正。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-10-23 08:48:54

我的解决方案比您预期的要长一些,我相信可以缩短,但是:

代码语言:javascript
复制
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,然后将列BC放在一个列中:

代码语言:javascript
复制
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()创建顺序索引,结果是:

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

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

代码语言:javascript
复制
    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)进行旋转

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

Stack Overflow用户

发布于 2015-04-07 20:06:14

我使用了以下方法

代码语言:javascript
复制
grouped = df.groupby('A')

df = grouped.aggregate(lambda x: tuple(x))

df['grouped'] = df['B'] + df['C']
票数 103
EN

Stack Overflow用户

发布于 2014-06-09 01:05:46

我正在回答标题和第一句中所述的问题:以下是将价值汇总到清单中的内容:

代码语言:javascript
复制
df.groupby('A').aggregate(lambda tdf: tdf.unique().tolist())

下面的简单示例演示了这一点:

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

产出如下:

代码语言:javascript
复制
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]
票数 48
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19530568

复制
相关文章

相似问题

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