Pandas Aggregate groupby

时间:2018-01-30 10:35:56

标签: python pandas aggregate pandas-groupby

我的数据框在概念上看起来如下:

df = pd.DataFrame({
    "a": [1, 1, 1, 2, 2,3],
    "b": ["a", "a", "c", "a", "d","a"],
    "c": ["2", "3", "4", "2", "3","2"]
})

      a    b    c
  0   1   'a'  '2' 
  1   1   'a'  '3'
  2   1   'c'  '4'
  3   2   'a'  '2'
  4   2   'd'  '3'
  5   3   'a'  '2'

对于a中的每个群组,我需要计算到此处的唯一(b,c)值。

所以在这个例子中,ouptut应该是[3,4,4]

(因为在第1组中有3个唯一(b,c)对,在第1组和第2组中共有4个唯一(b,c)值,在第1组和第2组以及第3组中也只有4个唯一(b,c)值。

我尝试将expandinggroupbynunique一起使用,但我无法弄清楚语法。

任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:2)

首先找到唯一行的索引:

idx = df[['b','c']].drop_duplicates().index

然后找到每组中剩余行数的累积总和:

np.cumsum(df.iloc[idx,:].groupby('a').count()['b'])

返回

a
1    3
2    4

答案 1 :(得分:2)

我改进了Dan的答案。

df['t'] = np.cumsum(~df[['b','c']].duplicated())
df.groupby('a')['t'].last()
Out[44]: 
a
1    3
2    4
3    4
Name: t, dtype: int64

答案 2 :(得分:1)

这是一个棘手的问题。这就是你要追求的吗?

result = (
    df.a.drop_duplicates(keep='last')
    .reset_index()['index']
    .apply(lambda x: df.loc[df.index<=x].pipe(lambda x: (x.b+x.c).nunique()))
     )


result
Out[27]: 
0    3
1    4
Name: index, dtype: int64

答案 3 :(得分:0)

您可以在分组后使用drop_duplicates并获取对象的shape

df = pd.DataFrame({
    "a": [1, 1, 1, 2, 2],
    "b": ["a", "a", "c", "a", "d"],
    "c": ["2", "3", "4", "2", "3"]
})
result = df.groupby("a").apply(lambda x: x.drop_duplicates().shape[0])

如果您想在以下列表中转换结果:

result.tolist()

您的示例结果为[3,2],因为您有{3}组的3对独特情侣和a=1组的2对独特情侣。

如果你想要colums'b'和'c'的唯一情侣数:

a=2