Wpis z mikrobloga

#python #datascience #openai #programista15k #excel #programowanie #pytanie #kiciochpyta

Mirasy,
Potrzeba jest pomyślunku, lepszego niż mój

Są sobie 10 list słowników, wygląd przykładowych:

data1 = [{'klucz1': wartosc1, 'klucz2': [wartosc2, wartosc3, wartosc4]},
{'klucz1': wartosc5, 'klucz2': [wartosc6, wartosc7, wartosc8]}]
.
.
.
data2 = [{'klucz1': wartosc1, 'klucz2': [wartosc20, wartosc30, wartosc40]},
{'klucz1': wartosc9, 'klucz2': [wartosc60, wartosc70, wartosc80]}]
.
.
.
data3 = podobnie jak data1 tylko inne wartości (podaje do nich jedynki, tak by było czytelne) Tutaj wartość pod 'klucz1' często jest taka sama w różnych data tj dla pierwszego słownika wartosc1, ale niestety nie zawsze ( ͡° ͜ʖ ͡°)
.
.
.
data10

I teraz trzeba mi to poupychać w csvkę żeby wartości z 'klucz1' stanowiły nagłówki kolumny a lista z 'klucz2' stanowiła dane w kolumnie. Następnie każde dane dokładają swoją część tak że dane z każdym datan rosną w dół a nie w szerz

Wynikowa tabela ma wyglądać tak:

wartosc1----wartosc5----wartosc9
wartosc2----wartosc6----wartosc60
wartosc3----wartosc7----wartosc70
wartosc4----wartosc8----wartosc80
wartosc21----wartosc61
wartosc31----wartosc71
wartosc41----wartosc81

Liczba kluczy w listach jest stała i wynosi 2
Wartość drugiego klucza to lista z n elementami
Liczba słowników w liście głównej n

Zrobiłem to zipem i dictwriterem wchodząc w miliony forów i temporary list. Problem polega na tym, że nie każda data zawiera takie same wartości pod pierwszym kluczem i w przypadku innych, dane trafiały do złej kolumny. Chciałbym wiedzieć czy jest jakieś elegancki sposób na rozwiązanie tego problemu. Openai chat nie daje rady, przynajmniej ja nie umiem zapytać, może tutaj ktoś podpowie ( ͡° ͜ʖ ͡°)

Jestem początkujący jak coś, dlatego nie ogarniam takich podstaw

Pfa to moja głowa
SowaZ - #python #datascience #openai #programista15k #excel #programowanie #pytanie #...

źródło: comment_1672612841KIGx1RlTwHr81TQSbEZOSi.jpg

Pobierz
  • 10
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@SowaZ: no przy takich kiepskich danych (w sensie, niespójnych) to cudów nie urodzisz. Zawsze będzie też potrzebna decyzja czy wartość1 ma być nadpisywana, czy brana poprzednia (co wówczas z nową?)
Niemniej, samo rozpakowanie czy rozbicie możesz w miarę łatwo ogarnąć w stylu (wybacz, nie chce mi się sprawdzać, więc tylko na zasadzie idei):

lines = {}
for dict_ in data_x:
..for key, val in dict_.items(): # czy itemview czy co tam teraz
  • Odpowiedz
@Oo-oO: Dzięki za odpowiedź, trochę nie rozumiem Twojego kodu, ale domyślam się (jeśli jestem w błędzie- proszę popraw mnie), że założyłeś wartość nagłówka tj "1" i problem właśnie w tym, że nie mogę tego zrobić bo są one nieznane i nagłówki między plikami mogą się różnić pojedynczymi wartościmi. wartosc1 jak nie istnieje ma utworzyć nagłówek nowej kolumny, i teraz dane z listy spod klucz2 z słownika, w którym znalazła się
SowaZ - @Oo-oO: Dzięki za odpowiedź, trochę nie rozumiem Twojego kodu, ale domyślam s...

źródło: comment_1672689655RCh7cFnsqCc91O6h607DWE.jpg

Pobierz
  • Odpowiedz
@SowaZ: niezupełnie. Ale od początku, ja nie używałem tu w ogóle pandas, pewnie się da, ale da się też bez.
W moim przykładzie z tego co widzę do rozpakowania zabrakło też jeszcze jednego fora - skoro masz listy podpięte pod niektóre klucze, to musisz sprawdzać powiedzmy przed tmp.index(key): if not isinstance(val, str) - i w tym przypadku robić extend.

powiem tak, widać że coś próbujesz zrobić sam, a to nie
  • Odpowiedz
Dobra mam już połwę sukcesu dało to radę zamknąć w kilka linijek tzn:

import pandas
main_dict = {}
for dict_ in data:
....main_dict[dict_['klucz1']] = dict_['klucz2']
  • Odpowiedz
@SowaZ: no spoko, kolejność można trzymać zamieniając set() na listę, i odpowiednio add na append, tyle że wtedy oczywiście trzeba wiedzieć co się chce robić z duplikatami. Co do tego "20" które u mnie jest a nie powinno być - no tak, jak mówię, to było niejasne w twoim opisie, zawsze pierwszy słownik z kolejnego dataN ma być ignorowany? (czy w zasadzie dodałeś 3 kolejne linijki do wyjściowego więc nie
  • Odpowiedz