我有以下熊猫数据框:
a
0 0
1 0
2 1
3 2
4 2
5 2
6 3
7 2
8 2
9 1
我想将值存储在另一个数据帧中,例如每组连续的相同值组成这样的标记组:
A B
0 0 2
1 1 1
2 2 3
3 3 1
4 2 2
5 1 1
A列表示组的值,B列表示发生的次数。
这是我到目前为止所做的:
df = pd.DataFrame({'a':[0,0,1,2,2,2,3,2,2,1]})
df2 = pd.DataFrame()
for i,g in df.groupby([(df.a != df.a.shift()).cumsum()]):
vc = g.a.value_counts()
df2 = df2.append({'A':vc.index[0], 'B': vc.iloc[0]}, ignore_index=True).astype(int)
它可以工作,但是有点混乱。
您认为这样做的最短/更好的方法吗?
答案 0 :(得分:1)
我会尝试:
df['blocks'] = df['a'].ne(df['a'].shift()).cumsum()
(df.groupby(['a','blocks'],
as_index=False,
sort=False)
.count()
.drop('blocks', axis=1)
)
输出:
a B
0 0 2
1 1 1
2 2 3
3 3 1
4 2 2
5 1 1
答案 1 :(得分:1)
在熊猫> 0.25.0 中使用GrouBy.agg
:
new_df= ( df.groupby(df['a'].ne(df['a'].shift()).cumsum(),as_index=False)
.agg(A=('a','first'),B=('a','count')) )
print(new_df)
A B
0 0 2
1 1 1
2 2 3
3 3 1
4 2 2
5 1 1
熊猫<0.25.0
new_df= ( df.groupby(df['a'].ne(df['a'].shift()).cumsum(),as_index=False)
.a
.agg({'A':'first','B':'count'}) )