2017-12-06 3 views
0

Ich bin bei pandas und anderen Scipy-Bibliotheken irgendwie grün, also bin ich mir nicht sicher, wie das geht. Ich habe eine Liste von zwei Elementen Tupeln und ich bin die Anzahl der Male die gleiche Tupel Zählen gefunden wird, oder das umgekehrte Gegenstück, damit die Sortierung:So erstellen Sie DataFrame aus einem Zähler von Tupeln

In [24]: tuples 
Out[24]: 
[(1, 2), 
(1, 3), 
(1, 4), 
(2, 3), 
(2, 4), 
(3, 4), 
(2, 1), 
(3, 1), 
(4, 1), 
(3, 2), 
(4, 2), 
(4, 3)] 

In [30]: count = Counter([tuple(sorted(t)) for t in tuples]) 

In [31]: count 
Out[31]: Counter({(1, 2): 2, (1, 3): 2, (1, 4): 2, (2, 3): 2, (2, 4): 2, (3, 4): 2}) 

Ich versuche, ein DataFrame zu schaffen, die diese im Wesentlichen produziert Ausgabe:

1 2 3 4 
1 0 2 2 2 
2 2 0 2 2 
3 2 2 0 2 
4 2 2 2 0 
+0

Haben Sie Sie benötigen resultierende/gewünschte Datensatz in excatly diese Weise? Was versuchst du zu erreichen? – MaxU

+0

@MaxU es ist einfach, die Daten in einem 'DataFrame' für die Operationen zu haben, die es hat. Zum Beispiel, wenn ich wissen muss, wie oft ein gegebenes "t" mit anderen gepaart ist, kann ich einfach "df [t]". Wenn Sie es in einem 'Counter' haben, wird diese Indexierung nicht bereitgestellt. Das ist nur ein Beispiel, es kann viele andere geben. – dabadaba

Antwort

2

Was ist mit etwas anderen Ansatz?

ersten lasst uns einen DF von der SortedList von Tupeln erstellen:

In [272]: df = pd.DataFrame(np.sort(np.array(tuples), axis=1), columns=['c1','c2']) 

In [273]: df 
Out[273]: 
    c1 c2 
0 1 2 
1 1 3 
2 1 4 
3 2 3 
4 2 4 
5 3 4 
6 1 2 
7 1 3 
8 1 4 
9 2 3 
10 2 4 
11 3 4 

jetzt können wir Paare mit Pandas Technik zählen:

In [274]: res = df.groupby(['c1','c2']).size() 

In [275]: res 
Out[275]: 
c1 c2 
1 2  2 
    3  2 
    4  2 
2 3  2 
    4  2 
3 4  2 
dtype: int64 

Zugriff auf Daten in Multi-Index-DF:

In [277]: res.loc[(1,2)] 
Out[277]: 2 

In [278]: res.loc[(2,4)] 
Out[278]: 2 

wir können auch die resultierende DF entstapeln, die uns geben wird:

In [279]: res.unstack(fill_value=0) 
Out[279]: 
c2 2 3 4 
c1 
1 2 2 2 
2 0 2 2 
3 0 0 2 

Oder as proposed by @Dark:

In [280]: pd.Series(count).unstack(fill_value=0) 
Out[280]: 
    2 3 4 
1 2 2 2 
2 0 2 2 
3 0 0 2 
+0

Wie ich schon erwähnt habe, bin ich ein bisschen grün mit Pandas. Kannst du deine Antwort kurz erklären? – dabadaba

+1

Da es bereits eine Zählervariable gibt, können wir auch 'pd.Series (count) .unstack (fill_value = 0)' – Dark

+0

@Dark, guter Punkt - danke! :) – MaxU

Verwandte Themen