熊猫DataFrame滚动计数

时间:2018-07-26 09:56:58

标签: python pandas dataframe counting

我有以下熊猫数据框(仅作为示例):

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

目标是获得另一列 Stats ,该列计算 Data 列的元素,如下所示:

   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 个答案:

答案 0 :(得分: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 :(得分: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

详细信息

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