2016-11-10 8 views
0

Ich möchte Func schreiben und das zur Klasse hinzufügen. Ich benutzePython: Fehler beim Schreiben Klasse

import pandas as pd 
import tldextract 

domain = [] 
df = pd.DataFrame() 
df['urls'] = ['ru.vk.com', 'eng.facebook.com', 'ru.ya.ru'] 
urls = df.urls.values.tolist() 
class csv: 
    def get_domain(self, list_url, list, df): 
     self.list_url = list_url 
     self.list = list 
     self.df = df 
     for i, url in enumerate(list_url): 
      get_domain = tldextract.extract(url) 
      subdomain = get_domain[0] + '.' + get_domain[1] + '.' + get_domain[2] 
      if subdomain.startswith('.'): 
       subdomain = subdomain[1:] 
      elif subdomain.endswith('.'): 
       subdomain = subdomain[:-1] 
      elif subdomain.startswith('www.'): 
       subdomain = subdomain[4:] 
      list.append(subdomain) 
     df['subdomain'] = list 

df = csv() 
df.get_domain(urls, domain, df) 

Ich versuche Domain von den URLs zu bekommen, aber ich bekomme Fehler

AttributeError: csv instance has no attribute '__setitem__' 

Was sollte ich ändern?

+3

Warum benutzen Sie überhaupt eine Klasse? Es gibt nur eine Methode, und die drei Attribute könnten genauso gut lokale Variablen sein. –

+3

Hey, verwende reservierte Namen als deine Parameternamen. 'list' ist in python eingebaut. – JClarke

+0

Ist es beabsichtigt, dass 'self.list_url = list_url' und' self.list = list' nur Verweise auf die ursprünglichen Listen kopieren, erstellen diese Zuordnungen keine Kopien der Listen. Dafür brauchst du 'copy.deepcopy' (oder einen Hack mit einem Slice). – cdarke

Antwort

5

Sie nannte die Variable, die Sie die csv Instanz df, gleiche wie die Datenrahmen Element zu erstellen, verwenden, von diesem zu machen df beziehen sich auf csv Objekt und nicht Panda Datenrahmen. Dann, wenn Sie versuchen, get domain aufzurufen, bezieht sich auf die Klasse, die keine Möglichkeit hat, eine Zeichenfolge Indizes zu erhalten und damit fehlgeschlagen.


Kurz gesagt - ändern Sie die Variablennamen in den letzten 2 Reihen, wie

csv_df = csv() 
csv_df.get_domain(urls, domain, df) 

By the way, es ist kein Fehler, aber ich bin ziemlich sicher, dass die letzte Zeile auf get_domain sollte

self.df['subdomain'] = self.list 

(das Gleiche gilt für alle Variablen über die Funktion geht alles sein, da Sie die cl ändern wollen Ass-Eigenschaft und nicht die gegebene Variable).

Und Sie sollten keine Variable list oder ein anderes reserviertes Schlüsselwort nennen. Könnte Probleme verursachen.

+0

Ich mag den Vorschlag, keine Klasse zu verwenden und nur die Methode besser zu definieren. –

0

Ich weiß nicht, was Sie sonst noch ändern sollten, aber Sie sollten die get_domain-Variable NICHT unbedingt in der Methode get_domain verwenden. Beginne damit und dann, ob es etwas löst.

(die get_domain Funktion in der zweiten Zeile der Klasse ist, und die get_domain Variable ist in der 6. Zeile der Klasse)

Edit: und noch eine Sache, hat der Code in der Methode keine Relevanz whatsoever zu den Werten im ... nennen wir es Testdaten. Es könnte falsch sein oder es könnte richtig sein, aber Sie haben keine Ahnung.

Verwandte Themen