2016-07-06 2 views
0

Ich möchte Werte über mehrere Spalten hinweg filtern, um Datenrahmen für die eindeutigen Wertekombinationen zu erstellen. Jede Hilfe wäre willkommen.Erstellen von Datenrahmen aus eindeutigen Wertepaaren durch Filtern über mehrere Spalten

Hier ist mein Code, der (gegebenen Datenrahmen df) versagt:

dd = defaultdict(dict) #create blank default dictionary 
values_col1 = df.col1.unique() #get the unique values from column 1 of df 
for i in values_col1: 
    dd[i] = df[(df['col1']==i)] #for each unique value create a sorted df and put in in a dictionary 
    values_col2 = dd[i].col2.unique() #get the unique values from column2 of df 
    for m in values_col2: 
     dd[i][m] = dd[i][(dd[i]['col2']==m)] #for each unique column2 create a sub dictionary 

Als ich es betreibe ich eine sehr lange Fehlermeldung. Ich werde die ganze Sache hier nicht einsetzen, aber hier ist ein Teil davon:

C:\Anaconda3\lib\site-packages\pandas\indexes\base.py in get_loc(self, key, method, tolerance) 1944 try: -> 1945 return self._engine.get_loc(key) 1946 except KeyError:

...

ValueError: Wrong number of items passed 6, placement implies 1

+0

Erfahren Sie mehr über numpy Permutationen. – Merlin

Antwort

2

Verwenden Pandas groupby Funktionalität der einzigartigen Indizes und die entsprechenden Zeilen Ihres Datenrahmen zu extrahieren.

import pandas as pd 
from collections import defaultdict 

df = pd.DataFrame({'col1': ['A']*4 + ['B']*4, 
        'col2': [0,1]*4, 
        'col3': np.arange(8), 
        'col4': np.arange(10, 18)}) 

dd = defaultdict(dict) 
grouped = df.groupby(['col1', 'col2']) 
for (c1, c2), g in grouped: 
    dd[c1][c2] = g 

Dies ist die df generiert:

col1 col2 col3 col4 
0 A  0  0 10 
1 A  1  1 11 
2 A  0  2 12 
3 A  1  3 13 
4 B  0  4 14 
5 B  1  5 15 
6 B  0  6 16 
7 B  1  7 17 

Und die dd extrahiert (na ja, dict(dd) wirklich)

{'B': {0: col1 col2 col3 col4 
      4 B  0  4 14 
      6 B  0  6 16, 
     1: col1 col2 col3 col4 
      5 B  1  5 15 
      7 B  1  7 17}, 
'A': {0: col1 col2 col3 col4 
      0 A  0  0 10 
      2 A  0  2 12, 
     1: col1 col2 col3 col4 
      1 A  1  1 11 
      3 A  1  3 13}} 

(ich weiß nicht, was für Ihren Anwendungsfall das ist, aber Sie können besser sein, das Objekt groupby sowieso nicht zu einem Wörterbuch zu analysieren).

+0

Danke Alberto, wie hast du im obigen Code "gruppiert" erstellt? – sparrow

+0

Sorry, habe vergessen, diese Zeile zu kopieren. Bearbeitet. –

+0

Danke für die elegante Lösung! – sparrow

Verwandte Themen