Python 3.x - lci déclenche une erreur - “seul de position de l'indexeur est hors-limites”
Je suis en raclant les données de l'élection d'un site web et d'essayer de le stocker dans un dataframe
import pandas as pd
import bs4
import requests
columns = ['Candidate','Party','Criminal Cases','Education','Age','Total Assets','Liabilities']
df = pd.DataFrame(columns = columns)
ind=1
url = requests.get("http://myneta.info/up2007/index.php?action=show_candidates&constituency_id=341")
soup = bs4.BeautifulSoup(url.content)
for content in soup.findAll("td")[16:]:
df.iloc[ind//7,ind%7-1] = content.text
ind=ind+1
print(df)
Essentiellement, à chaque itération de contenu.le texte va me fournir une valeur qui va me remplir dans le tableau. La boucle va peupler les valeurs de df dans la séquence suivante -
df[0,0]
df[0,1]
df[0,2]
.
.
.
df[1,0]
df[1,1]
.
.
et ainsi de suite. Malheureusement, le lci est de lancer une erreur - "seul de position de l'indexeur est hors-limites". Le plus drôle, c'est quand j'essaie df.iloc[0,0] = content.text
en dehors de la boucle for (dans une cellule séparée pour objectif de test), le code fonctionne correctement, mais dans la boucle for, il crée une erreur. Je crois qu'il pourrait être quelque chose de trivial, mais je suis incapable de le comprendre.S'il vous plaît aider
ind%7-1
produira -1
pour 7, ce qui est probablement à vous jeter hors. Aussi, est votre exemple? DataFrame.iloc
ne devraient même pas être en mesure d'ajouter des données (ou j'ai raté quelque chose dans votre exemple).je suis d'accord, mais qui va se passer après la boucle for a couru 6 fois. Le problème est que ce n'est pas en cours d'exécution même une fois. J'ai une logique de gestion des 'ind =7', mais pour arriver à cette logique , 'ind=1,2..." exécuter en premier
La question est toujours debout qu'à l'aide de
iloc
vous ne devriez pas être en mesure d'ajouter à un DataFrame
. Votre df
est initialement vide.Permettez-moi d'élucider plus simplement. Le problème revient finalement à quelque chose de ce genre - ' df1 = pd.DataFrame(colonnes= ['a','b','c']) df1.lci[0,0]=1 - # Ne fonctionne pas de la Sortie - la seule position de l'indexeur est hors des limites du terrain df1.loc[0,'a']=1 - nombre de Travaux d'impression(df1) de Sortie a b c 0 1 NaN NaN'
Quelle est la version de pandas utilisez-vous?
OriginalL'auteur Rohan Bapat | 2016-06-22
Vous devez vous connecter pour publier un commentaire.
DataFrame.iloc
ne peut pas agrandir son objet cible. C'est le message d'erreur, mais a changé depuis la version 0.15.En général un
DataFrame
n'est pas destiné à être construit ligne par ligne. Il est très inefficace. Au lieu de cela, vous devez créer un plus traditionnels de la structure de données et remplir uneDataFrame
:De l'inspection de la page dans votre demande, il semble que vous avez été au bout de la table avec l'id "table1", qui a pour la première ligne de l'en-tête (mauvais choix de la part des auteurs de cette page, devraient ai été dans
<thead>
, pas le corps). Donc ignorer la première ligne ([1:]
) et ensuite établir une liste de listes à partir des cellules des lignes.Bien sûr, vous pourriez tout aussi bien laisser les pandas vous soucier de l'analyse et de tous:
OriginalL'auteur Ilja Everilä
C'est une solution de contournement. Je reçois le même lci erreur avec mes pandas version. Ce code modifié le dépasse par la création d'un enregistrement vide (par la création d'un 1-ligne dataframe et en les ajoutant à un existant) à chaque itération avant d'assigner des valeurs.
OriginalL'auteur user3404344