2017-08-26 3 views
0

J'ai une fonction que je l'ai fait pour gratter les données de la table d'une longue liste d'URL (statistiques de baseball). Chaque entrée d'URL contient une table unique pour un seul lecteur, avec plusieurs lignes de données. Les lignes de chaque URL représentent toutes les saisons de la carrière d'un joueur. Le paramètre d'entrée est, bien sûr, une liste de toutes les URL que je suis en train de gratter. Ainsi, la liste globale des listes de listes contient des données statistiques de plusieurs lecteurs. Pour chaque joueur, nous avons plusieurs lignes représentant toutes les années de leur carrière.Utiliser une fonction pour ajouter un identificateur unique à chaque sous-liste dans une liste de listes produite?

Toutes les URL proviennent du même domaine, mais avec des extensions différentes. Liste Exemple:

input_list = ['www.baseball.com/BarryBonds01', 'www.baseball.com/JohnRSmith01', 'www.baseballl.com/MickyJMantle01', 'www.baseball.com/JohnJSmith02, www.baseball.com/MickySMantle02] 

Cependant, les tableaux de chaque page d'URL ne contient pas d'identifiant unique. Ainsi, lorsque je crée la liste finale des listes de listes et la base de données finale, j'ai une longue liste de colonnes avec toutes mes données mais rien qui identifie de façon unique chaque sous-liste dans la base de données globale.

Comment puis-je ajouter un identifiant unique pour chaque sous-liste (pour chaque lecteur)? Un identifiant idéal serait l'extension de l'URL, mais je n'arrive pas à comprendre le code pour y arriver.

Actuellement, ma liste de sortie des listes de listes ressemble à quelque chose comme ceci (chaque liste de listes dans la liste élargie des listes de listes est un seul joueur):

output_list = [[[45, 54, 23, 23], [44, 22, 11, 55]], # Player A 
       [[32, 23, 54, 23], [223, 44, 55, 66], [23, 67, 74, 24]], # Player B 
       [[32, 46, 77, 44], [24, 65, 24, 44]], # Player C 
       [[23, 2, 5, 7], [22, 455, 44, 332]], # Player D 
       [[33, 33, 22, 55], [88, 2, 4, 66], [1, 0, 0, 8], [3, 3, 5, 6]]] # Player E 

La figure de sortie, cependant, regards comme ceci - sans identification des données de ligne appartenant à des joueurs particuliers.

dataframe image baseball data

Voici une meilleure représentation de ma liste de sortie:

output_list = [[45, 54, 23, 23], [44, 22, 11, 55], # Player A 
        [32, 23, 54, 23], [223, 44, 55, 66], [23, 67, 74, 24], # Player B 
        [32, 46, 77, 44], [24, 65, 24, 44], # Player C 
        [23, 2, 5, 7], [22, 455, 44, 332], # Player D 
        [33, 33, 22, 55], [88, 2, 4, 66], [1, 0, 0, 8], [3, 3, 5, 6]] # Player E 
+1

On dirait que vous voulez un dictionnaire qui stocke les URL comme la clé (ou au moins l'extension unique de l'URL de base), et les données en tant que valeur. Sans plus d'infos, il n'est pas vraiment possible d'y répondre. – roganjosh

+0

J'ai ajouté des informations clarifiant afin de rendre ma question plus facile à comprendre. Je vous remercie! – TJE

+0

Veuillez fournir un exemple de ce que votre sortie désirée ressemblerait. –

Répondre

1

Ce n'est pas une méthode très robuste pour obtenir ce que vous voulez, mais sans plus de détails, il est difficile de conseils. Dans une crise, cela devrait fonctionner:

# Since input and output are same length and aligned 
# We enumerate output to get the position, and value 
# Then use the position to find the corresponding element in input 
# Slice an identifier corresponding input 
# Append to all relevant output 

for index, player in enumerate(output_list): 

    # Slice URL from '/' onwards 
    identifier = input_list[index][input_list[index].find('/'):] 


    # loop through all players for stats 
    for stats in player: 

     # append identifier for each list of stat 
     stats.append(identifier) 

Cela devrait vous donner une colonne supplémentaire avec l'identifiant lorsque vous convertissez la liste de la liste de la liste à une df.

Il existe de meilleurs moyens d'accomplir cela, comme .zip() ou pd.DataFrame.from_dict(), mais cela devrait tenir dans votre code sans beaucoup de changements en aval.


Je vais laisser la réponse d'origine pour une référence future pour les autres utilisateurs.

En ce qui concerne votre nouveau format de sortie, il n'y a aucun moyen de le formater après le raclage. Le moyen le plus simple consiste à ajouter l'identificateur en utilisant la méthode ci-dessus, pendant grattage.

Par exemple:

master_list = [] 

for URL in input_list: 

    identifier = get_identifier(URL) 
    temp_list = run_scrape(URL) 

    for stats in temp_list 
     stats.append(identifier) 

    master_list = master_list + temp_list 

Je ne peux pas vous donner le code concret car je ne sais pas comment vous le faites. Toutes les fonctions dont vous avez besoin peuvent être dérivées des échantillons ci-dessus, ou peuvent simplement être telles quelles.

L'idée générale est d'ajouter l'identifiant chaque fois que vous obtenez un nouvel ensemble de données correspondant à votre URL, avant d'ajouter les 'données identifiées' à une liste principale, puis passez à l'URL suivante. Selon la façon dont vous effectuez le grattage, vous pouvez avoir ou non le contrôle du processus d'itération.

  • Si vous le faites, ci-dessus doivent travailler

  • Si vous n'êtes pas, s'il vous plaît vérifier la documentation de votre bibliothèque (il devrait y avoir une méthode qui permet une telle insertion)

    • Si la méthode n'existe pas, vous pouvez vérifier les docs pour les fonctions plus petites qui vous donnent plus de contrôle (bien que votre code sera plus complexe)

    • Y Vous pouvez vérifier S/O pour voir si quelqu'un a un problème similaire avec la bibliothèque que vous utilisez, et comment ils le résolvent. Sinon, vous pouvez poser une question spécifique à votre bibliothèque.

Ce n'est pas un problème de pandas géants plus

+0

J'ai essayé votre méthode mais j'obtiens l'attribut "AttributeError: 'str' n'a pas d'attribut 'append'." C'est la même erreur que je recevais quand j'ai essayé une méthode similaire auparavant. Merci pour l'aide en tout cas. – TJE

+0

Je viens de copier le code et ça marche. Pouvez-vous l'essayer indépendamment? c'est-à-dire exécutez le code avec seulement le code d'entrée, de sortie et ci-dessus, * sans * aucun code avant/après que vous pourriez avoir. – Yeile

+0

Voir mes modifications ci-dessus, à la fin de mon message. Oui, votre code fonctionne avec ma liste de sortie comme je l'ai écrit ci-dessus. Le problème (mon erreur) est que quand j'ai écrit mon échantillon output_list, j'essayais de montrer que chaque liste entre deux parenthèses représente un joueur différent. Mais ce n'est pas vraiment ce que ma liste de sortie ressemble - il n'y a pas de doubles crochets pour chaque joueur. Donc, c'est juste une liste de listes, où chaque liste est une rangée. Et j'espère créer une colonne contenant une étiquette d'identification avec le nom d'un joueur qui correspond à chacune des rangées qui appartiennent à ce joueur. – TJE