Łączenie dwóch plików CSV. Zliczanie.

Łączenie dwóch plików CSV. Zliczanie.
P3
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 5 lat
  • Postów:16
0

Mam dwa pliki CSV, jeden z danymi na temat lotnisk, drugi zawiera nazwy państw i ich powierzchnię. Chcę policzyć ilość lotnik na kilometr kwadratowy. Pierwszy pomysł jaki miałem to zliczyć ile razy występuję nazwa państwa w kolumnie"państwo" w pliku 'airports'. I następnie odpowiednie wartości podzielić. Niestety tutaj nie wiedziałem jak wziąć wartości z tego co zostało policzone, porównać nazwy z wartościami w pliku 'areas'.Drugi pomysł to połączyć dwa pliki ale znowu pojawił się ten sam problem. To co napisałem do tej pory

Kopiuj
import pandas as pd
import numpy as np
colnames=['numerek','nazwa','miasto','państwo','skrót1','skrót2','wspó1','wspoł2','numer1','numer2','oznaczenie','kontynent/stolica']
dane1=pd.read_csv('airports.csv',names=colnames,header=None)
dane2=pd.read_csv('area.csv')
df1=pd.DataFrame(dane1)
df2=pd.DataFrame(dane2)
df=pd.concat([df1.reset_index(), df2], axis=1).set_index('numerek')
a=df1['państwo'].str.split('|', expand=True).stack().value_counts()
print(df)



Guaz
Złóż sobie to w strukturę dwóch słowników. Jako klucz w obu daj nazwe państwa, jako wartość w jednym ilość lotnisk, w drugim powierzchnie. Następnie metodą get iterując po kluczach w słowniku, bierz obie wartości: powierzchnia / ilość. Wynik możesz zapisać choćby w trzecim z nich. Oczywiście da się to zrobić prościej, ale optymalizować najlepiej po napisaniu działającej wersji :). Druga opcja, to trójelementowe listy wewnątrz innej listy (lista dwuwymiarowa).
P3
Hmm... Ale tutaj pojawia się znowu problem, iż trzeba odczytać konkretną kolumnę jako klucz a do tego przypisać wartości liczby wystąpień tego państwa w owej kolumnie.
P3
@Guaz: Jeśli chodzi o plik area.csv to zamieniłem to na słownik w ten sposób: dane2=pd.read_csv('area.csv') df2=pd.DataFrame(dane2) d=dict(zip(df2.Country_Name,df2.Land_area))
P3
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 5 lat
  • Postów:16
0

@Guaz: Jeśli chodzi o mój pierwszy komentarz to pomyślałem o czymś takim:

Kopiuj
import pandas as pd
import numpy as np
colnames=['numerek','nazwa','miasto','państwo','skrót1','skrót2','wspó1','wspoł2','numer1','numer2','oznaczenie','kontynent/stolica']
dane1=pd.read_csv('airports.csv',names=colnames,header=None)
df1=pd.DataFrame(dane1)
a=df1['państwo'].str.split('|', expand=True).stack().value_counts()
e=dict(zip(df1.państwo,a))

Ale w wyniku otrzymuje tylko :
{'Papua New Guinea': 233, 'Greenland': 140, 'Iceland': 77, 'Canada': 2, 'Algeria': 1}

edytowany 1x, ostatnio: pawlo392
BZ
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:66
1

df1.państwo i a mają różne długości. zip() iteruje tyle razy ile elementów ma najmniejszy argument. The iterator stops when the shortest input iterable is exhausted.
Zmień ostatnią linijkę na

Kopiuj
e=dict(zip(a.index, a))

Wtedy oba argumenty będą miały tą samą ilość elementów.

edytowany 1x, ostatnio: bootcamp_z_czarnej_listy

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.