0

我有一个如下所示的数据框:

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'中的值也保持不变,则只有在'result'中添加计数器值否则应分配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() 的多种组合。似乎没有任何效果。

4

1 回答 1

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)
于 2018-09-08T14:10:41.543 回答