• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Python przestawienie tabeli- pandas- pivot

Object Storage Arubacloud
0 głosów
136 wizyt
pytanie zadane 23 sierpnia 2023 w Python przez benek111 Początkujący (260 p.)

Wartości w tabeli są typu Object. Kod do przestawienia:

pivot = pd.pivot_table(df3, 
            index=['Name','Id'],
            columns=['Dzien','We/Wy'],
            fill_value= 0,
            values=['Czas'], aggfunc=', '.join )

Wynik:

                czas   
dzien               01                                02
we/wy              es            ys                    es     ys
name      id
Ko         1    6:40,12:34        6;30,10:10          8:32   7:15
No         2    7:50,13:00        7:45,12:56           0      0

A potrzebuję, żeby wyglądało tak:

                 czas   
dzien               01                                02
ew/wy              es            ys                    es     ys
name      id
Ko         1    6:40             6;30                8:32   7:15
                  12:34            10:10                  0      0
No         2    7:50              7:45                  0      0
                  13:00            12:56                  0      0

 

Proszę o podpowiedź. 

Do całkowitego szczęścia brakowało by zamienienia miejscami kolumn es z ys.

komentarz 23 sierpnia 2023 przez adrian17 Ekspert (346,900 p.)
Nie rozumiem zbytnio.

To wygląda tak, jakby przypadkiem się składało że dla każdej kombinacji tych 4 wartości kolumn-kluczy masz od 0 do 2 wartości i chcesz je tak rozwinąć na wiersze...? Nie ma żadnej innej kolumny który by odróżniła ten wiersz 6:40 od 12:34?

1 odpowiedź

+1 głos
odpowiedź 23 sierpnia 2023 przez adrian17 Ekspert (346,900 p.)

Tak zupełnie na intuicję (patrz: moje pytanie wyżej), to można rozwiązać po prostu dodając nową kolumnę "rozróżniającą" wiersze o identycznych kluczach i dodanie jej do argumentu index.

df3["keyidx"] = df3.groupby(['Name', 'Id', 'Dzien', "We/Wy"]).cumcount()

pivot = pd.pivot_table(df3, 
            index=['Name','Id', 'keyidx'], # <-
            columns=['Dzien','We/Wy'],
            fill_value= 0,
            values=['Czas'], aggfunc=', '.join)

Wtedy pivot wygląda dokładnie jak pokazałeś, tylko z tą dodatkową kolumną widoczną.

komentarz 24 sierpnia 2023 przez benek111 Początkujący (260 p.)
edycja 24 sierpnia 2023 przez benek111
To powinno rozjaśnić wszystko, to jest przykładowy fragment ramki wejściowej do przekształceń:

Id Dzien Czas We/Wy Name
1   01   6:30     ys   Ko
1   01   6:40    es   Ko
2   01   7:45    ys   No
2   01   7:50    es   No
1   01   10:10  ys   Ko
1   01   12:34  es   Ko
2   01   12:56  ys   No
2   01   13:00  es   No
1   02    7:15   ys   Ko
1   02    8:32  es   Ko

Tam gdzie są Zera w tabelach wyżej, to po  fill_value= 0 (zastąpienie NaN)
komentarz 24 sierpnia 2023 przez benek111 Początkujący (260 p.)
Dane w ramce wejściowej są ułożone według dnia, godziny. W kolumnie we/we są możliwe tylko wartości ys lub es (wyjścia i wejścia, może ich być ich 0,1 lub kilka na dzień). to jest oczywiście tyko fragment ramki cała ma kilka setek wierszy z setkami Id,Name.
komentarz 24 sierpnia 2023 przez adrian17 Ekspert (346,900 p.)

No nie, to właśnie jest sprzeczne z tym co napisałeś:

W kolumnie we/we są możliwe tylko wartości ys lub es

Ale

 

1   01   12:34  we   Ko

W każdym razie... podtrzymuję to co wyżej napisałem.

komentarz 24 sierpnia 2023 przez benek111 Początkujący (260 p.)
Wielkie przepraszam. Poprawiłem ramkę, walnąłem się. Są tylko 2 wartości ys i es.

Hmm. A co miało by być w tej dodanej kolumnie rozróżniającego ten wiersz 6:40 od 12:34 - jak napisałeś? Te wiersze różnią się tyko godziną właśnie. W tym samym dniu mają w kolumnie we/we albo ys albo es i różne godziny. Może jakiś przykład ?
1
komentarz 24 sierpnia 2023 przez adrian17 Ekspert (346,900 p.)

Może jakiś przykład ?

Uhh... może przeczytaj jeszcze raz moją odpowiedź wyżej :)

1
komentarz 25 sierpnia 2023 przez benek111 Początkujący (260 p.)
Ok Przestawiłem  tabelę inaczej, tzn We/Wy dodałem do index. Nie jest to, to co chciałem osiągnąć na początku ale jest bardzo czytelne.

Dzięki za odzew.
komentarz 25 sierpnia 2023 przez adrian17 Ekspert (346,900 p.)
Uhh jeśli ten mój sposób Ci się jednak nie podoba, to ok.

Podobne pytania

0 głosów
1 odpowiedź 231 wizyt
pytanie zadane 15 kwietnia 2021 w Python przez T100 Obywatel (1,450 p.)
0 głosów
0 odpowiedzi 571 wizyt
0 głosów
0 odpowiedzi 89 wizyt
pytanie zadane 31 sierpnia 2021 w Python przez masteryo Nowicjusz (120 p.)

92,760 zapytań

141,684 odpowiedzi

320,470 komentarzy

62,104 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...