2016-04-20 15 views
4

Ich habe ein sframe als solche:Wie kann man Zeilen in sframe extrahieren, wenn es einen Gelenkzustand und zwei separate Bedingungen gibt?

+---------+------+-------------------------------+-----------+------------------+ 
| term_id | lang |   term_str   | term_type | reliability_code | 
+---------+------+-------------------------------+-----------+------------------+ 
| IATE-14 | ro | Agenție de aprovizionare | fullForm |  3   | 
| IATE-84 | bg | компетенции на държави чле... | fullForm |  3   | 
| IATE-84 | cs | příslušnost členských stát... | fullForm |  3   | 
| IATE-84 | da |  medlemsstatskompetence | fullForm |  3   | 
| IATE-84 | de | Zuständigkeit der Mitglied... | fullForm |  3   | 
| IATE-84 | el | αρμοδιότητα των κρατών μελ... | fullForm |  3   | 
| IATE-84 | en | competence of the Member S... | fullForm |  3   | 
| IATE-84 | es | competencias de los Estado... | fullForm |  3   | 
| IATE-84 | et |  liikmesriikide pädevus | fullForm |  3   | 
| IATE-84 | fi | jäsenvaltioiden toimivalta | fullForm |  3   | 
| IATE-84 | fr | compétence des États membres | fullForm |  3   | 
| IATE-84 | ga | inniúlacht na mBallstát | fullForm |  3   | 
| IATE-84 | hu |  tagállami hatáskör  | fullForm |  3   | 
| IATE-84 | it | competenza degli Stati membri | fullForm |  3   | 
| IATE-84 | lt | valstybių narių kompetencija | fullForm |  2   | 
| IATE-84 | lv |  dalībvalstu kompetence | fullForm |  3   | 
| IATE-84 | nl | bevoegdheid van de lidstaten | fullForm |  3   | 
| IATE-84 | pl | kompetencje państw członko... | fullForm |  3   | 
| IATE-84 | pt | competência dos Estados-Me... | fullForm |  3   | 
| IATE-84 | ro | competența statelor membre... | fullForm |  3   | 
+---------+------+-------------------------------+-----------+------------------+ 

ich alle Zeilen extrahieren müssen, wo lang == 'de' or lang == 'en' aber die Zeilen I mit lang == 'en' Bedarf extrahieren ein lang == 'de', so dass sie die gleiche term_id teilen entsprechend zu haben.

Ich habe es als solches zu tun mit graphlab und sframe:

sf = gl.SFrame.read_csv('iate.csv', delimiter='\t', quote_char='\0', column_type_hints=[str,str,unicode,str,int]) 
de = sf[sf['lang'] == 'de'] 
de_termids = de['term_id'] 

und de.print_rows(10):

+------------+------+-------------------------------+-----------+------------------+ 
| term_id | lang |   term_str   | term_type | reliability_code | 
+------------+------+-------------------------------+-----------+------------------+ 
| IATE-84 | de | Zuständigkeit der Mitglied... | fullForm |  3   | 
| IATE-290 | de | Schutz der öffentlichen Ge... | fullForm |  3   | 
| IATE-662 | de | mengenmäßigen Ausfuhrbesch... | fullForm |  3   | 
| IATE-801 | de |  Eintragungshindernisse | fullForm |  2   | 
| IATE-1326 | de | Sonderregelung für Reisebü... | fullForm |  4   | 
| IATE-1702 | de |   Erwerbslose   | fullForm |  4   | 
| IATE-2818 | de | Verwaltungsvorschriften | fullForm |  3   | 
| IATE-21139 | de | frisches Obst und Gemüse | fullForm |  3   | 
| IATE-21563 | de | chemische Erzeugnisse zur ... | fullForm |  3   | 
| IATE-21564 | de |   Mineralsäuren   | fullForm |  3   | 
+------------+------+-------------------------------+-----------+------------------+ 

Und dann:

en = sf[sf['lang'] == 'en'] 
en.print_rows(10) 

[out]:

+------------+------+-------------------------------+--------------+------------------+ 
| term_id | lang |   term_str   | term_type | reliability_code | 
+------------+------+-------------------------------+--------------+------------------+ 
| IATE-84 | en | competence of the Member S... | fullForm |  3   | 
| IATE-254 | en | award of public works cont... | fullForm |  3   | 
| IATE-290 | en | public health protection | fullForm |  3   | 
| IATE-662 | en | quantitative restriction o... | fullForm |  3   | 
| IATE-801 | en |  grounds for refusal  | fullForm |  2   | 
| IATE-1299 | en |    CEP    | abbreviation |  3   | 
| IATE-1326 | en | special scheme for travel ... | fullForm |  3   | 
| IATE-2818 | en |   regulations   | fullForm |  3   | 
| IATE-7128 | en |   company name   | fullForm |  2   | 
| IATE-21139 | en | fresh fruits and vegetables | fullForm |  3   | 
+------------+------+-------------------------------+--------------+------------------+ 

Ich habe versucht:

en_de = en[en['term_id'] in de_termids] 

Aber ich bin immer die Syntax falsch, mir diesen Fehler geben:

--------------------------------------------------------------------------- 
RuntimeError        Traceback (most recent call last) 
<ipython-input-12-9656091794b8> in <module>() 
     1 en = sf[sf['lang'] == 'en'] 
----> 2 en_de = en[en['term_id'] in de_termids] 

/usr/local/lib/python2.7/dist-packages/graphlab/data_structures/sarray.pyc in __contains__(self, item) 
    691 
    692   """ 
--> 693   return (self == item).any() 
    694 
    695  def contains(self, item): 

/usr/local/lib/python2.7/dist-packages/graphlab/data_structures/sarray.pyc in __eq__(self, other) 
    973     return SArray(_proxy = self.__proxy__.vector_operator(other.__proxy__, '==')) 
    974    else: 
--> 975     return SArray(_proxy = self.__proxy__.left_scalar_operator(other, '==')) 
    976 
    977 

/usr/local/lib/python2.7/dist-packages/graphlab/cython/context.pyc in __exit__(self, exc_type, exc_value, traceback) 
    47    if not self.show_cython_trace: 
    48     # To hide cython trace, we re-raise from here 
---> 49     raise exc_type(exc_value) 
    50    else: 
    51     # To show the full trace, we do nothing and let exception propagate 

RuntimeError: Runtime Exception. Array size mismatch 

Wie soll ich das sframe filtern, so dass ich Zeilen bekommen en und de und entsprechende term_id?

Die resultierende Datenrahmen sollte wie folgt aussehen:

+---------+-----------------+-------------+ 
| term_id |  term_str_en | term_str_de | 
+---------+-------------------------------+ 
| IATE-999 | something | etwas  | 
... 
+---------+-----------------+-------------+ 

Wie kann ich mit pandas das gleiche tun?

Antwort

2

Angenommen hat für beide Sprachen: df_en und df_de. Dann können Sie sie merge:

new_df = pd.merge(df_en[['term_id','term_str']], df_de[['term_id','term_str']], how = 'inner', on ='term_id', suffixes = ('_en', '_de')) 

Verfahren inner kümmert um alle unvermittelten Zeilen zu überspringen. Sie können weitere Optionen merge in Pandas finden docs und refs

bearbeiten

das gleiche Ergebnis ohne zwei Datenrahmen zu schaffen (df ist der Original-Datenrahmen mit allen Einträgen, möglicherweise auch andere Sprachen zu enthalten):

new_df = pd.merge(df.loc[df['lang']=='en',['term_id','term_str']], df.loc[df['lang']=='de',['term_id','term_str']], how = 'inner', on ='term_id', suffixes = ('_en', '_de')) 
+0

Danke! gibt es eine Möglichkeit, dies zu tun, ohne 'df_en' und' df_de' zuerst zu erstellen? – alvas

+1

@alvas Ja. Statt 'df_en' können Sie' df [df ['lang'] == 'en'] 'und ähnlich für' verwenden de '. Ich bearbeite die Antwort in einer Sekunde. Grundsätzlich ist es die gleiche Prozedur, aber ohne explizit neue Daten zu erstellen Rahmen. – ptrj

+0

Ich bin froh, dass ich helfen konnte. – ptrj

0

meinen Sie, dass für jede term_id sollte die lang 'de' sein, oder ('de', 'en') aber nicht 'en' nur? wenn ja,

denke ich, können Sie wählen, lang = ‚de‘ oder ‚en‘ und auszufiltern term_id, die Sie bereits haben zwei Datenrahmen mit gefilterten Daten nur ‚de‘ in der lang

+0

Dies funktioniert: 'sf_deen = sf [sf [ 'lang' ] == ('de' oder 'en')], um die Zeilen mit de und en zu erhalten, aber sie werden nicht durch 'term_id' ausgerichtet, um den gewünschten Datenrahmen zu erhalten, wie in der Frage gezeigt = ( – alvas

0

Ich bin im Moment auf einem Telefon, aber ich denke, dass Sie die Indexausrichtung nutzen und Joins machen möchten.

z.

de_terms = sf [sf ['lang'] == 'de'].set_index ('term_id') 

Dies wird term_id der Index für den Datenrahmen machen. Führen Sie dasselbe für en aus, und weisen Sie dann unter einem neuen Name den Begriff der Spalte von einem zu dem anderen zu.

Normalerweise bestimmt das Ziel, welche Indizes enthalten sind, also z. Wenn Sie nur Einträge mit 'en' hinzufügen möchten, wenn sie auch 'de' haben, aber alle 'de', fügen Sie die en-Spalte in den de-Rahmen ein; Indizes nur im En-Frame werden gelöscht. oder Sie können filtern, um boolesche Kombinationen von no-nan zu erhalten.

1

Da Sie nur Antworten für Pandas bekommen haben, hier ist, wie es in SFrame zu tun, da de_termids und en in Ihrem Code-Beispiele:

en.filter_by(de_termids, 'term_id')