受this帖子的启发,我想在每个分组的数据框中获得一个值的明确计数,并在数据框中创建一个具有不同计数值的列。 像这样:
原始数据框:
import pandas as pd
df = pd.DataFrame(
{'A' : ['foo', 'foo', 'foo', 'foo',
'bar', 'bar', 'bar', 'bar'],
'B' : ['foo', 'fo', 'foo', 'foo',
'bar', 'bar', 'ba', 'ba'],
'C' : [2, 4, 4, 2, 5, 4, 3, 2]})
df
A B C
0 foo foo 2
1 foo fo 4
2 foo foo 4
3 foo foo 2
4 bar bar 5
5 bar bar 4
6 bar ba 3
7 bar ba 2
应用链接帖子的方法:
df=df.groupby(['A','B'])['C'].apply(lambda x: len(x.unique()))
df
每个关联帖子方法的结果:
A B
bar ba 2
bar 2
foo fo 1
foo 2
Name: C, dtype: int64
期望的结果:
A B C Distinct Count of C per A and B
0 foo foo 2 2
1 foo fo 4 1
2 foo foo 4 2
3 foo foo 2 2
4 bar bar 5 2
5 bar bar 4 2
6 bar ba 3 2
7 bar ba 2 2
看第一行," foo"在" A"和" foo" in" B"有2个与之关联的唯一值(2和4),对于A列和B列的值组合,每行产生2个。
提前感谢!
答案 0 :(得分:1)
使用transform
代替apply
,因为它返回的列大小与原始版本相同,我无法找到原始pandas site的文档,但是来自帮助:
转换(func,* args,** kwargs)方法 pandas.core.groupby.SeriesGroupBy实例
调用函数在每个组上生成一个类似索引的系列并返回 具有转换值的系列
df['Distinct Count of C per A and B'] = df.groupby(['A','B'])['C'].transform(lambda x: len(x.unique()))
In [1495]: df
Out[1495]:
A B C Distinct Count of C per A and B
0 foo foo 2 2
1 foo fo 4 1
2 foo foo 4 2
3 foo foo 2 2
4 bar bar 5 2
5 bar bar 4 2
6 bar ba 3 2
7 bar ba 2 2