Многоуровневые группы и проверка дубликатов - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть фрейм данных, который выглядит следующим образом:

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

Мне нужно получить еще один столбец 'result' с условием:

, если для определенного значения в '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 ().Кажется, ничего не работает.

1 Ответ

0 голосов
/ 08 сентября 2018

То же самое или нет, можно достичь с помощью 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...