Exemple de données
Étant donné le cadre de données suivant :
| feature | gene | target | pos |
| 1_1_1 | NRAS | AATTGG | 60 |
| 1_1_1 | NRAS | TTGGCC | 6 |
| 1_1_1 | NRAS | AATTGG | 20 |
| 1_1_1 | KRAS | GGGGTT | 0 |
| 1_1_1 | KRAS | GGGGTT | 0 |
| 1_1_1 | KRAS | GGGGTT | 0 |
| 1_1_2 | NRAS | CCTTAA | 2 |
| 1_1_2 | NRAS | GGAATT | 8 |
| 1_1_2 | NRAS | AATTGG | 60 |
Le problème
Pour chaque caractéristique, je voudrais compter combien de cibles apparaissent dans chaque gène, avec les règles suivantes :
- Si une cible n'apparaît que dans une seule position (colonne pos) pour chaque gène, elle obtient un compte de 1 pour chaque temps vu.
- Si la même cible apparaît dans plusieurs positions pour chaque gène, elle obtient un compte de (compte à la position/total des positions trouvées).
- Résumer les comptes totaux de chaque gène par caractéristique
Ce que j'ai fait jusqu'à présent
matches.groupby(["FeatureID", "gene"]).size().reset_index()
matches['multi_mapped'] = np.where(matches.groupby(["FeatureID", "gene", "target"]).pos.transform('nunique') > 1, "T", '')
Ce qui me donne un cadre de données où les cibles qui apparaissent à plus d'une position sont marquées comme vraies. Maintenant, je dois juste trouver comment normaliser les comptes.
Sortie souhaitée
| feature | gene | count
| 1_1_1 | NRAS | 2
| 1_1_1 | KRAS | 1
| 1_1_2 | NRAS | 3
Ainsi, dans l'exemple ci-dessus pour 1_1_1 NRAS, où AATTGG est trouvé à la fois à la position 60 et à la position 20, chacun obtiendrait un compte de 0,5. Comme TTGGCC n'a été trouvé qu'une seule fois à une position, il obtient un compte de 1, ce qui donne un compte total de 2.
Si pour 1_1_1 NRAS TTGGCC a été trouvé 3 fois à la même position, chacun de ces cas obtiendra un compte de 1, pour un total de 3 + 0,5 + 0,5 = 4.
La solution doit vérifier si la même cible apparaît à différentes positions, puis ajuster les comptages en conséquence, et c'est la partie qui me pose problème. Mon but ultime est de choisir le gène ayant le plus grand nombre d'occurrences par groupe.