我有一个概念上看起来像下面这样的数据框架:
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)值。
因此,在本例中,输出应为[3,4,4]。
(因为在组1中有3个唯一的(b,c)对,并且在组1和2中一起有4个唯一的(b,c)值,并且在组1和2和3中一起也只有4个唯一的(b,c)值。
我试着在groupby和nunique中使用expanding,但是我不能理解它的语法。
任何帮助都将不胜感激!
发布于 2018-01-30 19:04:20
这是一个棘手的问题。这就是你要找的吗?
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发布于 2018-01-30 19:05:29
首先找到唯一行的索引:
idx = df[['b','c']].drop_duplicates().index然后求出每组中剩余行数的累积和:
np.cumsum(df.iloc[idx,:].groupby('a').count()['b'])返回
a
1 3
2 4发布于 2018-01-30 19:48:13
我改进了丹的答案。
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: int64https://stackoverflow.com/questions/48519313
复制相似问题