J'essaie de combiner ces chaînes et ces lignes dans certaines logiques: aperçu des données: p> 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
3 Réponses :
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 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> "Vol" code> et déposer les lignes où la colonne Livres commence par
"Vol" code>. Le code pourrait être:
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']
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 I> et encore Harry Potter) I> pour File == 'ert.txt' code> et
id == 2 code>. 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
Démarrer depuis Créez ensuite votre Dataframe: P> Importer re code> (vous l'utiliserez).
df = df.drop(df[df.book.str.match(r'^Vol \d+$').fillna(False)].index)\
.drop(columns=['book2'])
Utilisation mise à jour d'origine Fusionner code>,
Appliquer code>,
update code>,
drop_duplicates code>.
set_index code> et
fusionner code> sur l'index
fichier code>,
id code> entre DF de
'Harry Potter' < / code> et
df code> de
'vol 1' code>;
rejoindre code> pour créer une chaîne appropriée et le convertir en Dataframe p>
df code>,
drop_duplicate code >, et
réinitialiser_index code> p>
Puis-je vérifier si fichier -
ert.txt code> id =
2 code> est juste dans vos données d'exemple ..? Lotr et Harry Potter ont-ils un identifiant
2 code> dans ce fichier ..? Cela rend les choses maladroites si oui
De plus, comment avez-vous obtenu
vol 1 code> après
seigneur des anneaux code>?
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