Python: porovnání dvou sloupců

asd

Python: porovnání dvou sloupců
« kdy: 29. 10. 2018, 08:09:54 »
Dobry den.

Mam nasledujucu ulohu. V csv su 3 stlpce ID, EN, SK. ID je jasne potom EN je anglicky preklad a ja musim spravit SK. V tom En je vela rovnakych poloziek (Ine ID rovnaky text). Teraz prichadza moja otazka. Ako v pytone spravit to aby mi to so stlpca EN naslo napriklad vsetky bunky kde je slovo YES a automaticky doplnilo do stlpca SK preklad aky chcem? Dakujem za vsetky podnety
« Poslední změna: 29. 10. 2018, 10:13:04 od Petr Krčmář »


mentor

Re:python porovnavanie dvoch stlpcov
« Odpověď #1 kdy: 29. 10. 2018, 09:16:54 »
Dobry den.

Mam nasledujucu ulohu. V csv su 3 stlpce ID, EN, SK. ID je jasne potom EN je anglicky preklad a ja musim spravit SK. V tom En je vela rovnakych poloziek (Ine ID rovnaky text). Teraz prichadza moja otazka. Ako v pytone spravit to aby mi to so stlpca EN naslo napriklad vsetky bunky kde je slovo YES a automaticky doplnilo do stlpca SK preklad aky chcem? Dakujem za vsetky podnety

Pošli kritickou čast kódu co jsi zatím vypotil a mi ti pak pomůžeme  8)

ondatra2

Re:python porovnavanie dvoch stlpcov
« Odpověď #2 kdy: 29. 10. 2018, 09:17:43 »
Tohle zní jako úloha na slovník.

Re:Python: porovnání dvou sloupců
« Odpověď #3 kdy: 29. 10. 2018, 11:16:13 »
Zalezi na mnozstve a logike akou ten SK preklad chces tvorit...

jedna moznost je cli appka, kde sa ta bude postupne pytat na preklad jednotlivych ENG vyrazov a pred spatanim skontroluje ci si to uz neprelozil (uz prelozene uklada do dictionary alebo inak logicky hlada) je to neefektivne ale aj tak to bude cakat na teba...

Ale otazka je ci je python to prave...

da sa csv hodit do excelu, nasledne ho rozbit do buniek... spravit pivot tabulku kde je kazdy en vyraz iba raz, poprekladat to a potom vlookupom doplnit do original tabulky a exportovat do csv kde je vysledok...

ale na plnohodnotnu odpoved je malo "vstupnych informacii" :)

asd

Re:Python: porovnání dvou sloupců
« Odpověď #4 kdy: 29. 10. 2018, 11:19:02 »
Ved to je to co este nie je pre mna celkom ciste.Ako k tomu efektivne pristupovat. Aktualne nacitam cele csv zobrazim jden stlpec potom druhy mozem editovat ale nenapada ma ako efektivne riesit rovnake hodnoty v jednom stlpci.

Karol Gasparik aktualne je to tak riesene skrz excel ale su zariadenia kde si excel nemozes spustit a zasa nemozes "preklad" skopcit ale mozes spustit svoju apku. (Toto fakt neriesme preco ano a preco nie je to firemna politika a bodka)


cinnamon

Re:Python: porovnání dvou sloupců
« Odpověď #5 kdy: 29. 10. 2018, 12:07:26 »
Co třeba použít SQLite -> načíst csv do tabulky a hodnoty pak měnit jednoduše updatem...

user

Re:Python: porovnání dvou sloupců
« Odpověď #6 kdy: 29. 10. 2018, 12:15:37 »
Niekedy hrame taku blbost, ze ci sa da problem vyriesit v priebehu 5 minut na 5 riadkov, podarilo sa  ;D
Kód: [Vybrat]
import csv
name = '__tu_meno_suboru__.csv'
with open(name, newline='') as f: my_csv = [row for row in csv.reader(f)]
my_dict = {word: input('Zadaj preklad pre "%s": ' % word) for word in set(row[1] for row in my_csv)}
with open(name, 'w', newline='') as f: csv.writer(f).writerows(([row[0], row[1], my_dict[row[1]]] for row in my_csv))

Zrozumitelnejsie tu https://pastebin.com/UXFaVFc1

m

Re:Python: porovnání dvou sloupců
« Odpověď #7 kdy: 29. 10. 2018, 12:30:05 »
Niekedy hrame taku blbost, ze ci sa da problem vyriesit v priebehu 5 minut na 5 riadkov, podarilo sa  ;D
Kód: [Vybrat]
import csv
name = '__tu_meno_suboru__.csv'
with open(name, newline='') as f: my_csv = [row for row in csv.reader(f)]
my_dict = {word: input('Zadaj preklad pre "%s": ' % word) for word in set(row[1] for row in my_csv)}
with open(name, 'w', newline='') as f: csv.writer(f).writerows(([row[0], row[1], my_dict[row[1]]] for row in my_csv))

Zrozumitelnejsie tu https://pastebin.com/UXFaVFc1

jj pouzit `set` a je to celkem bez prace :D

Re:Python: porovnání dvou sloupců
« Odpověď #8 kdy: 29. 10. 2018, 12:45:14 »
Niekedy hrame taku blbost, ze ci sa da problem vyriesit v priebehu 5 minut na 5 riadkov, podarilo sa  ;D
Kód: [Vybrat]
import csv
name = '__tu_meno_suboru__.csv'
with open(name, newline='') as f: my_csv = [row for row in csv.reader(f)]
my_dict = {word: input('Zadaj preklad pre "%s": ' % word) for word in set(row[1] for row in my_csv)}
with open(name, 'w', newline='') as f: csv.writer(f).writerows(([row[0], row[1], my_dict[row[1]]] for row in my_csv))

Zrozumitelnejsie tu https://pastebin.com/UXFaVFc1


Za mna krasne riesenie... trosku asi usli zatvorky "]]]" pri zapise suboru ale inak velmi elegantne :)

Taketo mini veci ma vzdy vela naucia...

PS: pisem iba preto lebo som nenasiel palec hore alebo plusko  :)

gll

  • ****
  • 429
    • Zobrazit profil
    • E-mail
Re:Python: porovnání dvou sloupců
« Odpověď #9 kdy: 29. 10. 2018, 17:05:33 »
jestli můžete instalovat závislosti, tak bych použil pandas

Kód: [Vybrat]
import pandas as pd

df = pd.read_csv('in.csv')
df.loc[df['EN'] == 'yes', 'SK'] = 'ano'
df.to_csv('out.csv')

mtd

Re:Python: porovnání dvou sloupců
« Odpověď #10 kdy: 29. 10. 2018, 18:08:10 »
Buď bych tohle rozdělil do dvou kroků, tj. udělat merge řádků podle identických anglických textů, to vyexportovat jako csv, udělat překlady a v druhém kroku načíst překlady z toho zmergovaného csv a rozkopírovat je zpět do původního csv. merge asi nějak takhle (píšu to z hlavy):

import operator
import itertools
def merge(items, idcol = 'id'): #list of dicts
 k = operator.itemgetter('EN')
 for label, g in itertools.groupby(sorted(items, key=k), k):
   ids = [it[idcol] for it in g]
   yield {**g[0], 'ids': ids}


Nebo bych si napsal jednoduchou qt appku, co bude zobrazovat tabulku, kde se budou zobrazovat jen řádky s neduplicitníma anglickýma textama a při zápisu do buňky se slovenským textem se bude zapisovat do všech řádků se stejným anglickým textem v modelu pod tím.
« Poslední změna: 29. 10. 2018, 18:11:34 od mtd »

gll

  • ****
  • 429
    • Zobrazit profil
    • E-mail
Re:Python: porovnání dvou sloupců
« Odpověď #11 kdy: 29. 10. 2018, 18:28:28 »
Buď bych tohle rozdělil do dvou kroků, tj. udělat merge řádků podle identických anglických textů, to vyexportovat jako csv, udělat překlady a v druhém kroku načíst překlady z toho zmergovaného csv a rozkopírovat je zpět do původního csv. merge asi nějak takhle (píšu to z hlavy):

import operator
import itertools
def merge(items, idcol = 'id'): #list of dicts
 k = operator.itemgetter('EN')
 for label, g in itertools.groupby(sorted(items, key=k), k):
   ids = [it[idcol] for it in g]
   yield {**g[0], 'ids': ids}


Nebo bych si napsal jednoduchou qt appku, co bude zobrazovat tabulku, kde se budou zobrazovat jen řádky s neduplicitníma anglickýma textama a při zápisu do buňky se slovenským textem se bude zapisovat do všech řádků se stejným anglickým textem v modelu pod tím.

musíte z g vyrobit list, abyste ho mohl indexovat, g = list(g) na začátek smyčky.

+ 1 za použití itemgetter. Nemám rád lambdy v Pythonu.