#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 и т. Д