我有一个看起来像这样的数据框:
cid e tp
A 1 1
A 1 1
A 2 2
A 2 2
A 3 3
A 3 3
A 3 4
A 3 5
B 3 23
B 3 23
B 3 23
B 3 23
B 3 23
B 3 23
B 4 24
B 5 25
B 5 26
B 5 27
B 5 27
B 5 27
C 1 28
C 1 28
C 2 29
D 1 30
D 2 31
D 3 32
D 4 33
D 4 33
我需要在条件下获取另一列“结果”:
如果对于“ cid”中的特定值保持相同,对于“ e”中的特定值并且“ tp”中的值也保持相同,则仅在“结果”中添加计数器值,否则应为0分配。 最终的数据帧应如下所示:
cid e tp result
A 1 1 1
A 1 1 1
A 2 2 2
A 2 2 2
A 3 3 0
A 3 3 0
A 3 4 0
A 3 5 0
B 3 23 3
B 3 23 3
B 3 23 3
B 3 23 3
B 3 23 3
B 3 23 3
B 4 24 4
B 5 25 0
B 5 26 0
B 5 27 0
B 5 27 0
B 5 27 0
C 1 28 5
C 1 28 5
C 2 29 6
D 1 30 7
D 2 31 8
D 3 32 9
D 4 33 10
D 4 33 10
尝试了where(),groupby()和shift()的多个组合。似乎没有任何作用。
答案 0 :(得分:0)
无论是否相同,都可以通过np.unique
来实现。
df1 = df.groupby(['cid','e']).agg({'tp':lambda x: np.unique(x)})
df1['result'] = df1['tp'].apply(lambda x: type(x) is not np.ndarray)
tp result
cid e
A 1 1 True
2 2 True
3 [3, 4, 5] False
B 3 23 True
4 24 True
5 [25, 26, 27] False
C 1 28 True
2 29 True
D 1 30 True
2 31 True
3 32 True
4 33 True
添加计数器可以通过cumcount()
。
df1= df1[df1['result']]
df1['tp'] = df1['tp'].astype(int)
df1['result'] = df1.groupby('result').cumcount()+1
tp result
cid e
A 1 1 1
2 2 2
B 3 23 3
4 24 4
C 1 28 5
2 29 6
D 1 30 7
2 31 8
3 32 9
4 33 10
最后合并它们并填充0。
df1 = df1.reset_index()
df = pd.merge(df,df1,on=['cid','e','tp'],how='left').fillna(0)