-1
votes

Python - Groupe Dataframe basé sur certaines chaînes

J'essaie de combiner ces chaînes et ces lignes dans certaines logiques: xxx pré>

aperçu des données: p> xxx pré>

J'ai des bouchons de fichiers Nom Colonnes avec ID associées à celle-ci. J'ai une colonne "book" où Vol 1 a été en rangée séparée. Je sais que ce vol1 est associé uniquement à "Harry Potter" dans l'ensemble de données donné. Basé sur le groupe par «fichier» et «id», comment puis-je combiner 'vol 1' dans la même rangée où 'Harry Potter' String apparaît dans la ligne? Remarque Certaines lignes de données n'ont pas VO1 pour Harry Potter, je veux seulement 'Vol 1' lorsque vous regardez le fichier et l'ID Groupby. p>

2 essaie: p>

1st: ne fonctionne pas p>

file     id  book
abc.txt  1   Harry Potter - Vol 1
ert.txt  2   Lord of the Rings - Vol 1
ert.txt  2   NaN
ert.txt  2   Harry Potter


4 commentaires

Puis-je vérifier si fichier - ert.txt id = 2 est juste dans vos données d'exemple ..? Lotr et Harry Potter ont-ils un identifiant 2 dans ce fichier ..? Cela rend les choses maladroites si oui


De plus, comment avez-vous obtenu vol 1 après seigneur des anneaux ?


C'est déjà dans l'original df @vnc - juste pas dans "Aperçu"


@Vnc 'Seigneur des Anneaux - Vol 1' a été propre à proximité, la ficelle 'Harry Potter' est la douleur pleine. Je ne veux pas assigner 'vol 1' à moins d'avoir montré la combinaison dans le fichier et l'identité. Cela aurait pu être "vol 2" mais ce serait faux si j'ai dit "Vol 1" pour toute la chaîne "Harry Potter ', comme le code 2ème tentative, je veux donc laisser cela seul


3 Réponses :


0
votes

En supposant que "vol x" se produit sur la ligne suivant le titre, j'utiliserais une série auxiliaire obtenue en déplaçant la colonne de livre par -1. Il suffit alors de combiner cette série avec la colonne de livre lorsqu'elle commence par "Vol" code> et déposer les lignes où la colonne Livres commence par "Vol" code>. Le code pourrait être: xxx pré>

si la commande dans le fichier de données n'est pas garantie, mais si une ligne vol x em> correspond à l'autre ligne de Dataframe avec le même fichier et ID, vous Peut diviser le Dataframe en 2 parties une contenant les lignes vol x em> et une contenant les autres et mettez à jour ce dernier de l'ancien: p>

g = df.groupby(df.book.fillna('').str.match('Vol [0-9]+'))
for k, v in g:
    if k:
        df_vol = v
    else:
        df = v

for row in df_vol.iterrows():
    r = row[1]
    df.loc[(df.file == r.file)&(df.id==r.id), 'book'] += ' - ' + r['book']


3 commentaires

Merci pour la réponse. J'ai essayé le code ci-dessus, il fonctionne bien avec l'exemple de fichier de données que j'ai fourni. Après avoir postulé à mon ensemble de données, j'ai réalisé que la chaîne «Harry Potter» pourrait être dans n'importe quel ordre dans le «fichier» et «ID». Donc, lorsque j'ai supprimé 'Maj (-1)', il le mappe à la chaîne de commande suivante. Est possible de s'appliquer uniquement à la chaîne 'Harry Potter' et rien d'autre?


@sharp: Le problème est que vos données d'exemple contiennent 2 livres différents ( Seigneur des anneaux et encore Harry Potter) pour File == 'ert.txt' et id == 2 . Il a déjà été remarqué dans le commentaire de Chris A. Donc, je n'ai pas imaginé que cela pourrait constituer un identifiant unique ...


L'identifiant n'est pas unique pour réserver ou champ de fichier. C'est un identifiant dans le fichier. C'est pourquoi j'ai besoin de le combiner basé sur "fichier" et "id" pour vol 1



1
votes

Démarrer depuis Importer re code> (vous l'utiliserez).

Créez ensuite votre Dataframe: P>

df = df.drop(df[df.book.str.match(r'^Vol \d+$').fillna(False)].index)\
    .drop(columns=['book2'])


0 commentaires

0
votes

Utilisation Fusionner , Appliquer , update , drop_duplicates .

set_index et fusionner sur l'index fichier , id entre DF de 'Harry Potter' < / code> et df de 'vol 1' ; rejoindre pour créer une chaîne appropriée et le convertir en Dataframe xxx

mise à jour d'origine df , drop_duplicate , et réinitialiser_index xxx


0 commentaires