otrzymuje następujące dataframePandy sortować według kruszywa grupowej i kolumny
In [31]: rand = np.random.RandomState(1)
df = pd.DataFrame({'A': ['foo', 'bar', 'baz'] * 2,
'B': rand.randn(6),
'C': rand.rand(6) > .5})
In [32]: df
Out[32]: A B C
0 foo 1.624345 False
1 bar -0.611756 True
2 baz -0.528172 False
3 foo -1.072969 True
4 bar 0.865408 False
5 baz -2.301539 True
Chciałbym uporządkować je w grupach (A
) przez zagregowane sumy B
, a następnie przez wartość w C
(nie zagregowane) . Więc w zasadzie uzyskać kolejność grup A
z
In [28]: df.groupby('A').sum().sort('B')
Out[28]: B C
A
baz -2.829710 1
bar 0.253651 1
foo 0.551377 1
a następnie Prawda/Fałsz, tak że ostatecznie wygląda tak:
In [30]: df.ix[[5, 2, 1, 4, 3, 0]]
Out[30]: A B C
5 baz -2.301539 True
2 baz -0.528172 False
1 bar -0.611756 True
4 bar 0.865408 False
3 foo -1.072969 True
0 foo 1.624345 False
Jak można to zrobić?
Ponadto założyłem, że 'groupby's' sort = False' zwraca zwrócony losowo, niekoniecznie uporządkowany porządek (domyślam się, że kojarzyłem je ze słownikami python z jakiegoś powodu). Ale ta odpowiedź oznacza, że flaga gwarantuje zachowanie pierwotnej kolejności rzędów ramek danych? – beardc
Jestem w 99% pewien, że zachowuje kolejność grup po ich pierwszym wyświetleniu. Nie mam żadnego kodu, żeby to poprzeć, ale niektóre szybkie testy potwierdzają tę intuicję. – Zelazny7
Dzięki @ Zelazny7 za tę odpowiedź. Dokładnie tego chcę. Jednak wydaje się, że w najnowszym pakiecie pand, aby osiągnąć to samo 'Out [7]', 'inplace = True' powinno być dodane do argumentów w' Input [7] '. – MoonKnight