0
votes

Nouvelles colonnes Pandas basées sur différentes autres colonnes, en fonction d'une valeur d'une autre colonne

désolé pour le titre qui est peut-être plus compliqué que le problème lui-même;)

J'ai de suivi Pandas Dataframe P>

for i in range(1,4):
    j=df['anc']+i
    df['lap'+str(i)]= df['anc'+str(j)]


2 commentaires

Pourriez-vous fournir un exemple de sortie de ce que vous voulez indiquer ce fichier de données s'il vous plaît comme détaillé ici exemple de reproductible minimal


Merci pour votre point. J'ai ajouté la sortie que je veux obtenir.


3 Réponses :


0
votes

Un peu d'une approche "brute-force", mais je ne vois pas comment vous pouvez le faire autrement:

df[[f"lap{i}" for i in range(1,4)]]= \
    df.apply(lambda x: \
        pd.Series({f"lap{j}": x[f"anc{int(j+x['anc']-1)}"] for j in range(1,4)}) \
    , axis=1)


6 commentaires

Thks. Ne semble pas fonctionner. 'TypeError: l'objet' str 'ne peut pas être interprété comme un entier / KeyError: (' anc5.0 ', "s'est produite à l'index 1")'


J'ai ajouté une ligne - essayez: df ['ANC'] = DF ['ANC']. Astype (int) avant


Cela ne change rien :( toujours la même erreur.


Mais vous l'avez déjà appliqué avant, non? Je veux dire, cela devrait fonctionner comme, tant que vous ANC Colonne stocke des entiers.


Oui je l'ai appliqué en premier. Entrée [70]: DF ['ANC'] = DF ["ANC"]. Astype (int) df ["ANC"]. DTYPE OUT [70]: DTYPE ('int32') Puis j'essaie votre code et j'ai le erreur que j'ai partagée avec vous


Corrigé ma réponse!



1
votes

SET GRH & ANC Comme indice que nous cherchons à indexer dans les colonnes ANC [1-9] . Cela est également utile lorsque nous écrivons les colonnes de sortie: xxx

pour chaque ligne de ligne dans les colonnes à l'aide de la valeur ANC , qui est maintenant dans l'index, prenant Les 3 valeurs adjacentes, convertissez-les en une série avec des noms que vous vous attendez à la sortie et attribuez-les à la correspondance de colonnes de sortie xxx

df2 ressemble à ceci: < Pré> xxx

réinitialiser l'index à nouveau si vous souhaitez revenir grh & ANC Retour aux colonnes.


Recherche basée sur le nom alternatif au lieu de la recherche de position:

Définissez une fonction d'utilité pour effectuer la recherche de colonne fournie à un flotteur. Il doit accepter un flotteur car les pandas reviendraient automatiquement un INT64 à un float64 si la série contient des valeurs non entières. Utilisez cette fonction pour effectuer la recherche et pour attribuer la sortie. Le seul avantage de cette approche est qu'aucun set_index est requis. xxx


8 commentaires

Atténue les problèmes que OP avait avec ma réponse, mais si les colonnes sont sans ordonnance ...


@Grzegorzskibinski, alors op peut trier leurs colonnes avant d'appliquer ma procédure


Merci pour votre réponse détaillée qui est très utile pour moi. Cependant, j'ai toujours l'erreur suivante: ValueError: ("La longueur des valeurs transcédées est 1, indice implique 3" ", s'est produite à l'index (4, 10) ')


@Bebio, obtenez-vous cette erreur sur l'échantillon que vous avez partagé ou votre jeu de données complet?


@Haleemur Ali - Correct qui vaincre le but d'appeler par ordre vs appelant par nom :)


@Haleemurali, vous avez complètement raison. J'étais sur un échantillon non cohérent. Votre code fonctionne bien sur mon jeu de données complet. Merci encore pour votre temps.


@Grzegorzskibinski, je ne suis pas clair sur ce que votre point est. Quoi qu'il en soit, voir ma réponse mise à jour pour une approche basée sur la recherche de nom. BTW, votre tentative fournie a un bogue et fonctionnerait si ANC {J + X ['ANC'] - 1} est remplacé par ANC {int (x ["ANC '] + J-1)}


Mon objectif était que cette recherche de position est une approche risquée ici, pour ces raisons. Appeler par référence fonctionne bien mieux. Cheers, pour vérifier ma solution - mon cas de test n'était pas représentatif, je pense que c'est à son origine;)



0
votes
grh anc anc1    anc2    anc3    anc4    anc5    anc6    anc7    anc8    anc9    anc10   lap1    lap2    lap3    lap4    lap5    lap6
0   2   5   0.10000 0.12000 0.1800  0.14000 0.15000 0.1900  0.20000 0.10000 0.21000 0.24000 0.15000 0.19000 NaN NaN NaN NaN
1   3   7   0.03299 0.05081 0.0355  0.02884 0.03054 0.0332  0.03115 0.02177 0.04903 0.04399 0.03115 0.02177 0.04903 NaN NaN NaN
2   4   3   0.00000 0.00000 0.0000  0.00000 0.00000 0.0000  0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.0 NaN NaN
3   5   4   0.00000 0.00000 0.0000  0.00000 0.00000 0.0000  0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.0 0.0 NaN
4   6   1   0.10000 0.10000 0.1000  0.10000 0.10000 0.1000  0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.1 0.1 0.1

2 commentaires

Bonjour, et merci pour votre proposition. Cela ne correspond pas vraiment à mon problème. Le nombre de nouvelles colonnes de tour à ajouter n'est pas liée au numéro GRH. Son égal à 3 dans l'exemple.


J'ai compris. Je n'ai pas vu que le nombre de nouvelles colonnes de tour est fixe et qu'ils sont 3. Avec cette nouvelle information, il suffit de faire deux modifications pour corriger le code. Les modifications sont les suivantes: # numnewcols = df.grrh.max () ## code commenté numnewcols = 3 ## nouveau code # howmany = df.loc [rangée, 'GRH'] # Combien de valeurs alliées dois-je remplir ## code Howmany = 3 # Combien de valeurs allemandes dois-je remplir ## nouveau code