2017-06-06 4 views
0

Ich musste ein Diktat ausgewählter Werte in Gruppen von einem Dataframe ("gruppiert") gebaut bauen. idcolumn war eine Liste von einem String ["column_name"] (Ich habe es zu einer Liste gemacht, weil ich irgendwann einen anderen String/Spaltennamen für Operationen mit Labels anhängen musste).Strange groupby/Dataframe Verhalten mit Liste()

so habe ich als meine die Gruppen diese Anweisung abzurufen:

grouped.get_group(k).loc[:,idcolumn] 

, die

grouped.get_group(k).loc[:,idcolumn[0]] 

Ausgabe eines Datenrahmen der ausgewählten Daten mit [ „column_name“] vollkommen identisch arbeitet als Header.

Mein vollständiger Ausdruck war:

dict_to_build= {k: list(grouped.get_group(k).loc[:,idcolumn]) for k in grouped.groups.keys() } 

aber ich hatte einen sehr seltsamen Fehler.
Das eingebaute dict enthält alle Schlüssel, aber als eindeutigen Wert "column_name". Während, wenn ich

dict_to_build= {k: list(grouped.get_group(k).loc[:,idcolumn[0]) for k in grouped.groups.keys() } 

Die dict verwenden ist völlig in Ordnung.

als wie dies beispielhaft dargestellt:

In [115]: pde=pd.DataFrame({"a":[1,2,3,1,2,3], "column_name":["a","b","c","d","e","f"]}) 

In [116]: pde 
Out[116]: 
    a column_name 
0 1   a 
1 2   b 
2 3   c 
3 1   d 
4 2   e 
5 3   f 

In [117]: grouped=pde.groupby[1] 
Traceback (most recent call last): 

    File "<ipython-input-117-b504dadfee12>", line 1, in <module> 
    grouped=pde.groupby[1] 

TypeError: 'method' object is not subscriptable 


In [118]: grouped=pde.groupby("a") 

In [119]: grouped.get_group(1).loc[:,"column_name"] 
Out[119]: 
0 a 
3 d 
Name: column_name, dtype: object 

In [120]: list(grouped.get_group(1).loc[:,"column_name"]) 
Out[120]: ['a', 'd'] 

In [121]: list(grouped.get_group(1).loc[:,["column_name"]]) 
Out[121]: ['column_name'] 

jemand über mich aufklären kann, was geschieht? Es ist absolut seltsam für mich. Kommt das Problem von Datenframes, loc mit Liste als Parameter oder der Listenfunktion?

Antwort

1

Ich denke, der Grund ist,

grouped.get_group(1).loc[:,"column_name"] 

eine Reihe kehrt während

grouped.get_group(1).loc[:,["column_name"]] 

einen Datenrahmen zurück.

Wenn Sie die Liste (Serie) auflisten, werden die Werte der Serie zurückgegeben. Wenn Sie eine Liste (Dataframe) erstellen, werden die Spalten von df zurückgegeben, in diesem Fall 'Spaltenname'.

+0

Macht perfekten Sinn;) Vielen Dank! –

+1

Gern geschehen! – Allen