我有以下熊猫数据框(仅作为示例):
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 >元素”等等...
预先感谢您的帮助
答案 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