2017-10-07 1 views
2

Ich bin in einer komischen Situation. Ich habe mein Programmierproblem bereits gelöst, aber ich schaue zurück und versuche es mit Pandas zu implementieren. Ich dachte, das wäre ein guter Ort, um mit Pandas zu üben.Wie bekomme ich eindeutige Zeilen in einem Pandas-DF und füge die doppelten Einträge in eine Spalte ein?

Ich frage eine Datenbank ab, mache einige Berechnungen und zeige dann die Ergebnisse auf einer GUI mit einem PyQt QTableWidget an.

Ein Beispiel Tabelle nach den Berechnungen könnte wie folgt aussehen:

test_list = [["a", "b", "c", "d"], 
      ["1", "3", "5", "7"], 
      ["1", "4", "5", "7"], 
      ["2", "3", "6", "8"], 
      ["2", "4", "6", "9"]] 

Was ich tun möchte, bevor ich es angezeigt ist: Nutzen Sie die unterschiedlichen Zeilen basierend auf Spalten „a“, „c“ und " d "und füge die gelöschten Elemente aus der Spalte" b "wieder in die Spalte ein. Das Ergebnis, das ich wie folgt aussieht wollen:

['a', 'b', 'c', 'd'] 
['1', '3, 4', '5', '7'] 
['2', '3', '6', '8'] 
['2', '4', '6', '9'] 

Beachten Sie, wie in der Spalte "b", "3, 4" sind in ihrer Reihe vertreten beide.

Hier ist, wie ich es getan hätte zunächst mit Listen und Wörterbücher:

def mergeDistinct(my_list): 
    new_list_dict = {} 

    for elem in my_list[1:]: 
     key_str = (elem[0], elem[2], elem[3]) 
     if key_str in new_list_dict.keys(): 
      new_list_dict[key_str][1] += ", " + elem[1] 
     else: 
      new_list_dict[key_str] = elem[::] 
      new_list_dict[key_str][1] = elem[1] 

    ret_list = new_list_dict.values() 

    return [my_list[0]] + ret_list 

I Schleife über alle Zeilen und ein Wörterbuch verwenden, um zu verfolgen, was unterschiedliche Kombination von Werten wir bisher gesehen hat. Ich denke, es fühlt sich etwas klobig an und ich versuche meine Hand in der Pandabank. Ich denke, es sollte definitiv möglich sein, aber vielleicht kenne ich den richtigen Begriff nicht, um zu verstehen, wie man es macht.

Das ist, was ich bisher habe:

df = pd.DataFrame(data=test_list[1:], columns=test_list[0]) 

def mergeDistinctPandas(my_df): 
     #I feel like this is close but I don't know how to continue 
     df = my_df.set_index(['a', 'b', 'c', 'd']).groupby(level=['a', 'c', 'd']) 
     # for elem in df: 
      # print(elem) 
     # new_df = pd.DataFrame() 
     # for elem in df: 
      # merged = pd.concat([elem[1] for i, row in elem[1].iterrows()]) #.to_frame() 
      # merged.index = ['duplicate_{}'.format(i) for i in range(len(merged))] 
      # new_df = pd.concat([new_df, merged], axis=1) 

     return False 

Wenn ich drucken, was ich bis jetzt sehe ich die Zeilen getrennt sind und ich sie wieder zusammenführen können, „b“ getrennt zu verlassen, aber ich kann nicht sehen, wie es geht.

Wenn Pandas nicht für dieses Problem geeignet ist, ist das auch in Ordnung, ich versuche nur, damit fertig zu werden. Danke für die Hilfe.

Hier sind einige relevante Fragen, die ich gefunden habe: How to "select distinct" across multiple data frame columns in pandas? und How do I merge duplicate rows into one on a DataFrame when they have different values

Antwort

4
df.groupby([‘a’, ‘c’, ‘d’]).b.apply(‘, ‘.join) \ 
    .reset_index()[df.columns] 
+0

LOL nett Komma :-) – Wen

Verwandte Themen