我的数据框在概念上看起来如下:
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)
值。
我尝试将expanding
与groupby
和nunique
一起使用,但我无法弄清楚语法。
任何帮助将不胜感激!
答案 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