Python 按一列对数据帧进行分组并基于该列添加信息
我有这样一个数据帧:Python 按一列对数据帧进行分组并基于该列添加信息,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我有这样一个数据帧: df = pd.DataFrame({1:[1,1,1,2,2,2,3,4,5,6,7,8,9], 2:["a","a","x","b","b","y","c","d","e","f","g","h"
df = pd.DataFrame({1:[1,1,1,2,2,2,3,4,5,6,7,8,9],
2:["a","a","x","b","b","y","c","d","e","f","g","h","i"],
3:[0.5,0.6,0.7,0.8,0.9,0.10,0.11,0.13,0.13,0.14,0.15,0.16,0.17]})
我想:
In [33]: df.groupby(1).mean()
Out[33]:
3
1
1 0.60
2 0.60
3 0.11
4 0.13
5 0.13
6 0.14
7 0.15
8 0.16
9 0.17
但是,我不确定如何将第二列附加到分组
我尝试过按多个列进行分组:
In [34]: df.groupby([1,2]).mean()
Out[34]:
3
1 2
1 a 0.55
x 0.70
2 b 0.60
3 c 0.11
4 d 0.13
5 e 0.13
6 f 0.14
7 g 0.15
8 h 0.16
9 i 0.17
但在实际数据集中,它遗漏了几个条目
如果您注意到,在数据框中,每个条目的第二列数据都有一些差异(第1列下的数字1有2个“a”和一个“x”,而数字2有2个“b”和一个“y”)。这是因为在实际数据集中,由于错误和字符串数据中的微小差异(但不重要),条目之间存在微小差异
编辑
以上只是对问题的概念性描述。如果你需要更具体的东西。在查找平均值时,我想按“客户名称”和“客户地址”列进行分组,但由于某种原因,同时按这两列进行分组会导致条目丢失。如果我纯粹按照“客户名称”
进行分组,则有4300多个条目
In [35]: len(ensemble.("CUSTOMERS NAME").mean())
Out[35]: 4376
但是,如果我同时按姓名和地址分组,它会大幅下降:
In [36]: len(ensemble.groupby(["CUSTOMERS NAME","CUSTOMER ADDRESS"]).mean())
Out[36]: 4154
我知道某个地方出了问题,因为“CUSTOMERS NAME”
列中唯一值的总数是4376
为了澄清,输出应该是一个有三列的数据帧。第一个是客户名称,第二个是客户名称后的地址(第一个可以),第三个是该客户交易的平均值。如果2
col中的first
值可以,您可以使用:
或,如果需要所有值,您可以有一个列表:
In [586]: x = df.groupby(1, as_index=False).agg({2: list, 3:'mean'})
In [587]: x
Out[587]:
1 2 3
0 1 [a, a, x] 0.60
1 2 [b, b, y] 0.60
2 3 [c] 0.11
3 4 [d] 0.13
4 5 [e] 0.13
5 6 [f] 0.14
6 7 [g] 0.15
7 8 [h] 0.16
8 9 [i] 0.17
您的预期输出是什么?一旦您分组,每个组将只有一个条目。所以不能像那样简单地附加第二列值。您可以为每个组创建第二列值列表,并将其附加到分组的df。@MayankPorwal它应该是一个包含三列的数据框。第一个是客户的姓名,第二个是客户姓名后的地址(第一个可以),第三个是该客户交易的平均值。请检查我的答案。
In [583]: x = df.groupby(1, as_index=False).agg({2:'first', 3:'mean'})
In [584]: x
Out[584]:
1 2 3
0 1 a 0.60
1 2 b 0.60
2 3 c 0.11
3 4 d 0.13
4 5 e 0.13
5 6 f 0.14
6 7 g 0.15
7 8 h 0.16
8 9 I 0.17
In [586]: x = df.groupby(1, as_index=False).agg({2: list, 3:'mean'})
In [587]: x
Out[587]:
1 2 3
0 1 [a, a, x] 0.60
1 2 [b, b, y] 0.60
2 3 [c] 0.11
3 4 [d] 0.13
4 5 [e] 0.13
5 6 [f] 0.14
6 7 [g] 0.15
7 8 [h] 0.16
8 9 [i] 0.17