L'étiquette de l'indexation en fonction de Pandas (.loc)

Récemment, j'ai été mis au courant des dangers de enchaînés affectation, et je suis en train d'utiliser la bonne méthode d'indexation dans les pandas, loc[rowindex, colindex]. Je suis en train de travailler avec un mélange de types de données (mix au sein de la même série de np.float64 et la liste et la chaîne) - c'est inévitable. J'ai un index entier

Je suis en cours d'exécution de la boucle suivante par l'intermédiaire d'un bloc de données

Count = 0
for row in DF.index:
print row
    if '/' in str(DF.order_no[row]) and '/' not in str(DF.buyer[row]) and '/' not in    str(DF.buyer[row])\
    and '/' not in str(DF.smv[row]) and '/' not in str(DF.item[row]):
        DF.loc[row, 'order_no'] = str(DF.loc[row, 'order_no']).split('/')
        Count +=1

Compter

Qui renvoie l'erreur:

 TypeError: object of type 'int' has no len()

Ce que je fais mal?

Au sein de cette boucle je peux le faire:

print DF.loc[row, 'order_no']

et

print DF.loc[row, 'order_no'] == str(DF.loc[row, order_no]).split('/')

mais pas

DF.loc[row, 'order_no'] = str(DF.loc[row, order_no]).split('/')

À l'aide de l'instruction print je vois que ça coince sur la ligne 3, encore:

DF.loc[3, 'order_no']

fonctionne très bien.

Aider apprecitated.

MODIFIER

Une solution de contournement est la suivante:

Count = 0
Vals = []
Ind = []
for row in DF.index:
    if '/' in str(DF.order_no[row]) and '/' not in str(DF.buyer[row]) and '/' not in str(DF.buyer[row])\
    and '/' not in str(DF.smv[row]) and '/' not in str(DF.item[row]):
        Vals.append(DF.order_no[row].split('/'))
        Ind.append(row)
        Count +=1

DF.loc[Ind, 'order_no'] = Vals    

En d'autres termes, je peux créer une liste de valeurs à modifier et ensuite les modifier à l'aide .loc. Cela fonctionne bien ce qui m'amène à believge que le problème n'est pas avec les valeurs que je suis tryng à attribuer, et avec le processus de cession de lui-même.

Voici un exemple du type de données que je suis en train de travailler sur: Le code ne fonctionne pas sur la ligne 3 et 9 aussi loin que je peux dire. Désolé son au format csv, mais c'est la façon dont je le lis dans les pandas.

https://www.dropbox.com/s/zuy8pj15nlhmcfb/EG2.csv

À l'aide de données si celui-ci est fait:

EG = pd.reas_csv('EG.csv')
EG.loc[3, 'order_no'] = str(EG.loc[3, 'order_no']).split('/')

Échoue avec l'erreur

object of type 'int' has no len()

Mais

EG['order_no'][3] = str(EG.loc[3, 'order_no']).split('/')

fonctionne très bien, mais c'est le type de la chaîne d'affectation, je suis en train d'essayer d'éviter que cela me donnait des problèmes ailleurs.

c'est pourquoi je pensais que c'était juste une erreur de syntaxe.

Désolé pour ce désormais unweildy question

  • Ne DF.loc[3, 'order_no'] = str(DF.loc[3, order_no]).split('/') travail? Si non, le problème est probablement avec la valeur que vous essayez d'assigner. De l'imprimer et de voir ce qu'il est, et de la comparer aux valeurs que vous avez réussi à céder sur d'autres itérations.
  • Non il ne fonctionne pas, et ce n'est pas à cause de la valeur que je suis affectation, que je peux contrôler que la valeur et de l'affecter directement. En effet, la façon dont j'ai obtenu de contourner le problème est de créer une série de nouvelles valeurs indexées par la boucle et ensuite affecter les valeurs. Mais pour une raison ou une autre, le assingment l'intérieur de la boucle échoue toujours.
  • Désolé, je ne comprends pas ce que tu veux dire par "contrôler que la valeur et de l'affecter directement". Pouvez-vous fournir des exemples de données qui illustre bien le problème?
  • Fondamentalement, je peux confirmer que le problème n'est pas avec la valeur que je suis en train de assing. Voir l'édition ci-dessus:
  • Pouvez-vous fournir des exemples de données qui illustre bien le problème?
  • Votre solution de contournement n'est pas le même, puisque, dans l'original de votre code, vous affectez la valeur str(DF.loc[row, 'order_no']).split('/'), mais dans la solution de contournement vous attribuer DF.order_no[row].split('/')[0].
  • Désolé, oui, c'est vrai, mon erreur. Il fonctionne de la même de toute façon
  • OK, maintenant, je suis vraiment confus. J'ai tranché le bloc de données pour inclure le premier point à partir duquel le code breaksdown, de fournir les données de l'exemple, et il fonctionne très bien sur ces données. Mais il ne fonctionne toujours pas sur le bloc de données, je suis en train de travailler sur.
  • Jusqu'à ce que vous nous donner une complète SSCCE que l'on peut copier et coller -- @BrenBarn demandé un échantillon dataframe plusieurs fois -- vous êtes ce qui limite considérablement le nombre de ceux qui peuvent aider. (Beaucoup de gens ignorent souvent les questions qui ne sont pas SSCCE, comme il y a plus de suffisamment de questions qui sont pour nous occuper.)
  • Facile mec, il a demandé une fois. Je suis totalement ravi de vous fournir un exemple, je suis juste en train de travailler sur la façon d'obtenir les données ici.
  • respectueusement, c'est ce que vous faites avant de vous poser une question. Aussi: il a demandé à deux reprises. Voir le commentaire de départ "Désolé, je n'ai pas"; et puis il poliment répète exactement la même chose par la suite.
  • Yup, pensa celui-ci pourrait être juste une erreur de syntaxe de ma part. Je connais la valeur d'exemples. Lorsque l'on a appelé, j'ai eu à passer 10 minutes anonymising les données, comme il est confiedential.
  • Pourriez-vous essayer pour un petit exemple? Personnellement, je pense que c'est gênant pour diagnostiquer un guichet automatique, car il y a trop de bruit (par exemple baisse les colonnes que vous ne l'utilisez pas, certaines des lignes qui ne sont pas de la sensibilisation, en ligne avec la padn ont moins de problèmes de santé) dans l'idéal, plus petit que 5 par 5 🙂
  • Oui, désolé, j'ai limité les données sur les colonnes nécessaire.
  • la plus courte en cas de test possible: pd.DataFrame.from_dict({'working_hr': {3: 9.0}, 'order_no': {3: 731231}}).loc[3, 'order_no'] = [1,2]; Woody, vous pouvez modifier votre question avec ce cas de test si vous le souhaitez. Il tient compte de votre erreur.
  • La raison en est que la valeur est traitée comme une liste, et OP wan pas à le définir comme scalaire. L'inspection de code, ne peut pas voir comment cette erreur peut être évitée avec l'indexeur setter

InformationsquelleAutor Woody Pride | 2013-12-16