python, измеряйте уникальные элементы по строке, игнорируя определенные значения

У меня есть кадр данных из 6 столбцов, где каждая запись имеет последовательность чисел.

pd.DataFrame(FixByteOrderUnique)
Out[518]: 
         0   1   2    3    4  5
0       58  68  58   59   -1 -1
1       59  69  59   58   -1 -1
2       93  94  93   33   -1 -1
3       58  59  58   68   -1 -1
4       92  94  92   33   -1 -1
5       59  58  59   69   -1 -1
6       57  48  57   79   -1 -1
7       15  26  15  101   -1 -1

Я хочу, чтобы в каждой строке измерялось количество уникальных элементов, игнорируя при подсчете числа: -1 100, 101 и 102. Допустимые числа от [0,99].

Что я сделал, так это сделал лямбда-функцию, которая игнорирует при подсчете -1

def myfunc(row):
    if -1 in row.values:
        return row.nunique() - 1
    else:
        return row.nunique()

а затем вызовите мою функцию следующим образом

pd_sequences['unique'] = pd.DataFrame(FixByteOrderUnique).apply(myfunc, axis=1)

Как я могу включить в свою лямбда-функцию, чтобы проверить, является ли число из [0,99], чтобы иметь право на подсчет уникальности?


person Alex P    schedule 15.07.2019    source источник


Ответы (3)


Вы можете изменить myfunc на

def myfunc(row):
    return row[(row < 100) & (row > -1)].nunique()

используя логическое индексирование фрейма данных.

person James Liu    schedule 15.07.2019

Используя len, set и filter:

df['nuniq'] = df.apply(lambda a: len(set(filter(lambda x:x in range(100), a))), 1)
print(df)

Выход:

    0   1   2    3  4  5  nuniq
0  58  68  58   59 -1 -1      3
1  59  69  59   58 -1 -1      3
2  93  94  93   33 -1 -1      3
3  58  59  58   68 -1 -1      3
4  92  94  92   33 -1 -1      3
5  59  58  59   69 -1 -1      3
6  57  48  57   79 -1 -1      3
7  15  26  15  101 -1 -1      2
person Chris    schedule 15.07.2019

Измените функцию на:

def myfunc(row):
    return row.drop_duplicates()[0 < row.drop_duplicates() < 100]
person U11-Forward    schedule 15.07.2019