2 votes

Pandas groupby count avec conditions

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X