Изменить запись в фрейме данных Python Pandas, если совпадают другие записи в строках

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня есть фрейм данных с именем All_samp, где я хочу изменить записи в столбце на наименьшее значение, если другие записи в той же строке соответствуют записям в другой строке. Например, у меня есть этот фрейм данных

Указатель хромосома начать пример no_calls
22 chr1 190098060 8.1 600
23 chr1 190098060 9.1 858
24 chr1 190098078 8.1 201
25 chr1 190098093 8.1 250
26 chr1 190098093 8.1 32
27 chr1 190098093 8.1 271
28 chr1 190098119 8.1 288
29 chr1 190098123 10.1 146
30 chr1 190098123 10.1 307
31 chr10 190098123 8.1 366
32 chr1 190098160 8.1 298

Если совпадение хромосом, начала и образца совпадает, то я хочу, чтобы no_calls было минимальным значением совпадающих строк. Следовательно, это результат, который я ищу:

Указатель хромосома начать пример no_calls
22 chr1 190098060 8.1 600
23 chr1 190098060 9.1 858
24 chr1 190098078 8.1 201
25 chr1 190098093 8.1 32
26 chr1 190098093 8.1 32
27 chr1 190098093 8.1 32
28 chr1 190098119 8.1 288
29 chr1 190098123 10.1 146
30 chr1 190098123 10.1 146
31 chr10 190098123 10.1 366
32 chr1 190098160 8.1 298

Я пытался сделать это, создав серию столбцов no_calls с использованием itertuples и вложенного цикла для внесения изменений в записи. Благодаря этому я смогу заменить столбец no_calls измененной серией. Вот как выглядел мой код

 no_calls = []
for row1 in All_samp.itertuples():
    for row2 in All_samp.itertuples(): 
        if row1[0] != row2[0] and (row1[1] == row2[1] and row1[2] == row2[2] and row1[3] == row2[3]):
            print(row1[0], row2[0], row1[4], row2[4], min(row1[4], row2[4]))
            no_calls.append(min(row1[4], row2[4]))
            break
        else:
            no_calls.append(row1[4])
            break
 

В результате я просто получаю список исходных записей no_calls, и я полагаю, это потому, что мой оператор ‘if’ выполняет только первую итерацию, а не циклически перебирает все строки. Как только я заставлю цикл работать, я заменю столбец списком на

 All_samp['no_calls'] = no_calls
 

Если есть какие-либо идеи, как помочь мне исправить мой цикл или даже совершенно другой способ получить минимальные значения no_calls в моем фрейме данных (я уверен, что есть что-то лучше, чем циклы, я был бы очень признателен.

Кроме того, если есть способ, которым я могу представить фреймы данных, отличные от таблицы в StackOverflow, чтобы с ними было проще работать напрямую, пожалуйста, дайте мне знать.

Ответ №1:

Groupby и transform('min')

 df['NO_CALLS']=df.groupby(['CHROMOSOME','START','SAMPLE'])['NO_CALLS'].transform('min')
 

Комментарии:

1. Большое спасибо… Существуют ли определенные функции, которые могут быть преобразованы?

2. я думаю, что почти все функции, max, nunique, sum и т. Д