2017-12-20 1 views
0

Ich würde gerne Zeilen in bestimmten Spalte Basis auf die Beziehung mit anderen Spalte aggregieren und erstellen Sie bestimmte Spalte, die aggregierte Daten im JSON-Format enthalten.Wie Zeilen zu kombinieren und in einer Zeile in Datenrahmen von Sql oder Python

Dies ist das Beispiel.

Original-Datentabelle

Child Name  Child Age Father Name Father Age 
    Peter    5  Richard   40 
    James   15   Doug   45 
     Liz    2   Doug   45 
     Paul    6  Richard   40 
    Shirly   11  Charles   33 
     Eva    9   Chris   29 

konvertierte Datentabelle wird entweder

Father Name Father Age  Children 
    Richard   40  {"Peter":"5", "Paul":"6"} 
     Doug   45  {"James":"15","Liz":"2"} 
    Charles   33  {"Shirly" : "11"} 
     Chris   29  {"Eva" : "9"} 

Oder

Father Name Father Age  Children Name  Children Age 
    Richard   40  {"Peter", "Paul"}  {"5","6"} 
     Doug   45  {"James", "Liz"}  {"15","2"} 
    Charles   33  {"Shirly"}    {"11"} 
     Chris   29  {"Eva"}     {"9"} 

Mein Code ist

import pandas as pd 
df = pd.DataFrame({ 
    "Child Name" : ["Peter","James","Liz","Paul","Shirly","Eva"], 
    "Child Age" : ["5","15","2","6","11","9"], 
    "Father Name" : ["Richard","Doug","Doug","Richard","Charles","Chris"], 
    "Father Age" : ["40","45","45","40","33","29"] }) 

print df 

g1 = df.groupby(["Father Name"])["Child Name"].apply(", ".join).reset_index() 
g1.columns = ['Father Name','Children Name'] 
print g1 

und wird die Ausgabe

Father Name Children Name 
0  Charles   Shirly 
1  Chris    Eva 
2  Doug  James, Liz 
3  Richard  Peter, Paul 

ich kann nicht herausfinden sein, wie in den Spalten „Vater Alter“ und „Kinder Alter“ hinzuzufügen. Wie kann ich dies in Dataframe auf die effizienteste Weise konvertieren? Ich möchte Schleife über Python vermeiden, da es lange dauern wird, um zu verarbeiten.

Dank,

+1

Ihre ursprüngliche Tabelle ist nicht normalisiert. Sie sollten eine separate Vater- und Kindertabelle haben. – Anand

+0

Ich verstehe es nicht über die Normalisierung auf dem Originaltisch. Können Sie es mit einem einfachen Beispiel genauer erklären? –

Antwort

2

Schnell schmutzig ineffizient Hack, aber es vermeidet for-Schleifen. Würde gerne eine bessere Lösung haben; Ich nehme an, dass die mehreren df Kopien und mehrere Zusammenführungen vereinfacht werden könnten.

import pandas as pd 
df = pd.DataFrame({ 
    "Child Name" : ["Peter","James","Liz","Paul","Shirly","Eva"], 
    "Child Age" : ["5","15","2","6","11","9"], 
    "Father Name" : ["Richard","Doug","Doug","Richard","Charles","Chris"], 
    "Father Age" : ["40","45","45","40","33","29"] }) 

g2 = df.groupby(['Father Name'])["Child Name"].apply(list).reset_index() 
g3 = df.groupby(['Father Name'])["Child Age"].apply(list).reset_index() 
g4 = df[["Father Name", "Father Age"]].drop_duplicates() 

df2 = g2.merge(g4) 
df2 = df2.merge(g3) 
print(df2) 

Ausgang:

Father Name  Child Name Father Age Child Age 
0  Charles  [Shirly]   33  [11] 
1  Chris   [Eva]   29  [9] 
2  Doug [James, Liz]   45 [15, 2] 
3  Richard [Peter, Paul]   40 [5, 6] 
+0

Danke Evan für Ihre Zeit, das ist nah an der Ausgabe, die ich will, obwohl es keine Daten entweder JSON oder Listenformat erstellt. –

+0

Ah, hab es. Es gibt eine einfache Änderung, um eine Liste zu bekommen - siehe überarbeiteten Code :) – Evan

Verwandte Themen