2016-11-28 4 views
1

Ich versuche, einen Datenrahmen in n Gruppen basierend auf bestimmten Werten seiner Spalten zu teilen. Und endete mit dem untenstehenden Code. Aber es sieht nicht effizient zwischen verschachtelten For-Schleifen, ich bin auf der Suche nach einem eleganten Ansatz bei der Umsetzung des folgenden Codes. Kann jemand bitte Eingaben machen?Effiziente Verwendung von for-Schleifen in der Skala

Eingabe wird Spaltennamen sein, auf denen der Datenrahmen aufgeteilt werden soll. Also habe ich ein val in den verschiedenen Werten von Spalten speichern. Es speichert wie:

(0)(0) = F 
(0)(1) = M 
(1)(0) = drugY 
(1)(1) = drugC 
(1)(2) = drugX 

So habe ich insgesamt 5 mit Spaltenwerte wie folgt erstellt:

F and drugY 
M and drugY 
F and drugC 
M and drugC 
F and drugX 
M and drugX 
+0

Wenn Sie sind Wenn Sie diese Dinge mit 'DataFrame' machen, müssen Sie sich keine Gedanken über die Effizienz von' for' Loops machen. Spark Tipp 1 - Fast alle Operationen auf einem DataFrame sind sehr sehr teuer (relativ zur Effizienz der For-Schleife). –

Antwort

1

Ich verstehe nicht wirklich, was Sie tun wollen, aber wenn Sie die generiert werden soll Kombinationen des Spark-Datenrahmen api verwenden, können Sie es wie diese api

val patients = Seq(
    (1, "f"), 
    (2, "m") 
).toDF("id", "name") 

val drugs = Seq(
    (1, "drugY"), 
    (2, "drugC"), 
    (3, "drugX") 
).toDF("id", "name") 

patients.createOrReplaceTempView("patients") 
drugs.createOrReplaceTempView("drugs") 

sqlContext.sql("select p.id as patient_id, p.name as patient_name, d.id as drug_id, d.name as drug_name from patients p cross join drugs d").show 



+----------+------------+-------+---------+ 
|patient_id|patient_name|drug_id|drug_name| 
+----------+------------+-------+---------+ 
|   1|   f|  1| drugY| 
|   1|   f|  2| drugC| 
|   1|   f|  3| drugX| 
|   2|   m|  1| drugY| 
|   2|   m|  2| drugC| 
|   2|   m|  3| drugX| 
+----------+------------+-------+---------+ 

oder mit dem Datenrahmen tun

val cartesian = patients.join(drugs) 

cartesian.show 
(2) Spark Jobs 
+---+----+---+-----+ 
| id|name| id| name| 
+---+----+---+-----+ 
| 1| f| 1|drugY| 
| 1| f| 2|drugC| 
| 1| f| 3|drugX| 
| 2| m| 1|drugY| 
| 2| m| 2|drugC| 
| 2| m| 3|drugX| 
+---+----+---+-----+ 

Danach können Sie eine Kreuztabelle verwenden können, die eine Tabelle der Häufigkeitsverteilung

c.stat.crosstab ("patient_name", "drug_name") zu erhalten. Zeigen

+----------------------+-----+-----+-----+ 
|patient_name_drug_name|drugC|drugX|drugY| 
+----------------------+-----+-----+-----+ 
|      m| 1| 1| 1| 
|      f| 1| 1| 1| 
+----------------------+-----+-----+-----+ 
+0

Thnx für das Update, aber meine Anforderung ist auf einem einzelnen Datenrahmen, in dem ich es in n Teildatenrahmen basierend auf bestimmten Spalten teilen muss. In Ihrem Beispiel: angenommen, die Spalten - Patient_ID, Patientenname, Medikamentenname werden als Eingabe übergeben. Zuerst filtere ich die df basierend auf patient_id Also ich habe 2 dfs- df1 mit patient_id = 1 und df2 mit patient_id = 2 Die zweite Spalte ist Patientenname. Ich werde diese df1 und df2 für übereinstimmende Kriterien von patient_name filtern . So muss ich 4 df: patient_id = 1 patient_name = f, patient_id = 1 patient_name = m, pat_id = 2 pat_name = f, pat_id = 2 pat_name = m – Garipaso

+0

I wird jeder der obigen Datenrahmenfilter zum Abgleichen Kriterien von drug_name So werde ich 12 Datenrahmen haben: 1) patient_id = 1 Patient_name = f Drug_Name = DrugY und bald. Sobald alle diese Subdatenframes basierend auf der eingegebenen Eingabebedingung erstellt sind, werde ich einige zufällige Stichproben von jedem Datenframe abholen, das ist, was ich versuche, durch den obigen Code zu erreichen. Aber ich endete mit einigen For-Loops, die ich für nicht optimal halte. Also, auf der Suche nach einigen Vorschlägen, wie dies erreicht werden kann – Garipaso

+0

Warum wollen Sie viele Datenrahmen? Was machst du mit den Datenrahmen? – oluies

Verwandte Themen