Pandas DataFrame 滚动计数

3
我可以帮你进行翻译。这是一个关于Pandas数据框的例子:
import pandas as pd
df = pd.DataFrame(pd.Series(['a','a','a','b','b','c','c','c','c','b','c','a']), columns = ['Data'])


   Data
0     a
1     a
2     a
3     b
4     b
5     c
6     c
7     c
8     c
9     b
10    c
11    a

目标是获得另一列统计数据,以以下方式计算数据列的元素数:
   Data Stats
0     a      
1     a      
2     a    a3
3     b      
4     b    b2
5     c      
6     c      
7     c      
8     c    c4
9     b    b1
10    c    c1
11    a    a1

例如,a3 表示“三个连续的 a 元素”,c4 表示“四个连续的 c 元素”等等...

非常感谢您的帮助。

2个回答

2

以下是使用 groupby 的一种方法:

counts = df.groupby((df['Data'] != df['Data'].shift()).cumsum()).cumcount() + 1

df['Stats'] = np.where(df['Data'] != df['Data'].shift(-1),
                       df['Data'] + counts.astype(str), '')

print(df)

   Data Stats
0     a      
1     a      
2     a    a3
3     b      
4     b    b2
5     c      
6     c      
7     c      
8     c    c4
9     b    b1
10    c    c1
11    a    a1

1
谢谢@jpp,我会研究你和jezrael的两种解决方案。 - Gilberto

1
创建辅助函数Series s,用于获取列Data的连续值,通过GroupBy.transform按组获取计数,并将重复值替换为空的string
s = df['Data'].ne(df['Data'].shift()).cumsum()
a = df.groupby(s)['Data'].transform('size')

df['Stats'] = np.where(~s.duplicated(keep='last'), df['Data'] + a.astype(str), '')
print (df)
   Data Stats
0     a      
1     a      
2     a    a3
3     b      
4     b    b2
5     c      
6     c      
7     c      
8     c    c4
9     b    b1
10    c    c1
11    a    a1

Detail:

print (s)
0     1
1     1
2     1
3     2
4     2
5     3
6     3
7     3
8     3
9     4
10    5
11    6
Name: Data, dtype: int32

print (a)
0     3
1     3
2     3
3     2
4     2
5     4
6     4
7     4
8     4
9     1
10    1
11    1
Name: Data, dtype: int64

不移除重复项的解决方案更简单:
df['Stats'] = df['Data'] + a.astype(str)
print (df)

   Data Stats
0     a    a3
1     a    a3
2     a    a3
3     b    b2
4     b    b2
5     c    c4
6     c    c4
7     c    c4
8     c    c4
9     b    b1
10    c    c1
11    a    a1

感谢@jezrael提供的解决方案,我会学习它以提高我的Python知识。 - Gilberto
@Gilberto - 我只是指出来,因为我看到我的解决方案被接受了,然后没有;) - jezrael
我想要检查两个方案。对我来说,这两个解决方案都能解决问题,而且我认为它们对我来说都非常有趣(我对Python还很陌生)。 - Gilberto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接