Mam listę takich krotek
data = [
('r1', 'c1', avg11, stdev11),
('r1', 'c2', avg12, stdev12),
('r2', 'c1', avg21, stdev21),
('r2', 'c2', avg22, stdev22)
]
i chciałbym umieścić je w pandach DataFrame z wierszami nazwanymi przez pierwszą kolumnę i kolumnami nazwanymi przez drugą kolumnę. Wygląda na to, że sposób dbania o nazwy wierszy jest podobny, pandas.DataFrame([x[1:] for x in data], index = [x[0] for x in data])
ale jak zadbać o kolumny, aby uzyskać macierz 2x2 (wyjście z poprzedniego zestawu to 3x4)? Czy istnieje bardziej inteligentny sposób dbania o etykiety wierszy, zamiast ich jawnego pomijania?
EDYTUJ Wygląda na to, że będę potrzebować 2 ramek DataFrames - jednej dla średnich i jednej dla odchyleń standardowych, czy to prawda? Czy mogę przechowywać listę wartości w każdej „komórce”?
python
python-2.7
pandas
pivot
gt6989b
źródło
źródło
Odpowiedzi:
Możesz przestawić ramkę DataFrame po utworzeniu:
>>> df = pd.DataFrame(data) >>> df.pivot(index=0, columns=1, values=2) # avg DataFrame 1 c1 c2 0 r1 avg11 avg12 r2 avg21 avg22 >>> df.pivot(index=0, columns=1, values=3) # stdev DataFrame 1 c1 c2 0 r1 stdev11 stdev12 r2 stdev21 stdev22
źródło
0
i kolumna z nazwą1
nie są zbyt piękne ...Uważam, że lepiej zostawić swoje dane ułożone tak, jak są:
df = pandas.DataFrame(data, columns=['R_Number', 'C_Number', 'Avg', 'Std']) # Possibly also this if these can always be the indexes: # df = df.set_index(['R_Number', 'C_Number'])
Wtedy powiedzenie jest nieco bardziej intuicyjne
df.set_index(['R_Number', 'C_Number']).Avg.unstack(level=1)
W ten sposób jest domniemane, że chcesz zmienić kształt średnich lub odchyleń standardowych. Mając na uwadze, że samo użycie
pivot
jest oparte wyłącznie na konwencji kolumnowej dotyczącej tego, jaką istotę semantyczną przekształcasz.źródło
[R_Number, C_Number]
możeszdf.ix[('r1','c2')]
na przykład zrobić . Możesz też pozostawić je jako zwykłe kolumny i użyć indeksowania logicznego:df[(df.R_Number == 'r1') & (df.C_Number == 'c2')]
pivot
jest formatowanie jakiejś tabeli tak, aby była ładnie drukowana na ekranie lub ładnie eksportowana do HTML, LaTeX lub .csv, czy coś takiego. Podobnie jak formatowanie tabeli, która zostanie przesłana do prezentacji lub artykułu. W przeciwnym razie, jeśli chodzi o efektywne manipulowanie danymi, chcesz, aby rzeczy były wielindeksami, kiedy możesz (na przykład klucze do tabeli bazy danych) lub przynajmniej jako powtarzające się kolumny, abyś mógł wykonywać wydajne indeksowanie i łączenie itp. Ale tego nie robisz. chcą wysadzić ich we własne kolumny.Oto, czego się spodziewałem, kiedy doszedłem do tego pytania:
#!/usr/bin/env python import pandas as pd df = pd.DataFrame([(1, 2, 3, 4), (5, 6, 7, 8), (9, 0, 1, 2), (3, 4, 5, 6)], columns=list('abcd'), index=['India', 'France', 'England', 'Germany']) print(df)
daje
a b c d India 1 2 3 4 France 5 6 7 8 England 9 0 1 2 Germany 3 4 5 6
źródło