多级组和重复检查

时间:2018-09-08 11:53:32

标签: python pandas numpy

我有一个看起来像这样的数据框:

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()的多个组合。似乎没有任何作用。

1 个答案:

答案 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)