kretson
kretson
#python #programowanie #pytanie #pandas

Mirki, pomocy bo męczę się już jakiś czas z tym i nie mogę znaleźć rozwiązania.
Wszystko wydaję się oczywiste i proste, ale nie działa :D
Mam dwa dataframy : jeden (fdi) z jakimiś tam danymi gdzie jest kolumna powiedzmy kraj1 i kraj2 (w kodzie ISO). Drugi (rel) gdzie indeksem jest właśnie kod ISO kraju a kolumny to udziały procentowe różnych religii.
Chcę dodać do pierwszego zmienną zgodności religii w postaci : suma po wszystkich religiach z (udział w kraju1 * w kraju2) (potem jeszcze pierwiastek z tego, ale to już nieważne).
No i najpierw chciałem tak:
fdi["comrel"]=0
for column in rel.columns:
fdi["com
rel"] = fdi["com_rel"] + (rel.iloc[fdi.kraj1].column * rel.iloc[fdi.kraj2].column)
No ale nie działa (coś typy niezgodne), potem kombinowałem coś z typami, dalej nie szło, zrobiłem jeszcze jedną pętle po wierszach fdi i pętla się nie kończyła.
Rozłożyłem to sobie żeby znaleźć błąd, policzyłem sobie już ta zmienna oddzielnie (b) i teraz chcę tylko ją przenieść do tego fdi w taki sposób:
for x in range (1403):
fdi.iloc[x].com_rel = b[x]
Proste przepisywanie, a ciągle pętla w nieskończoność.
fdi.shape to 1404,30
Pewnie rozwiązanie jest banalne, ale uczę się dopiero i jakoś na stacku nie mogłem znaleźć odpowiedzi.
Z góry dzięki.
  • Najlepsze
  • Wszystkie komentarze
piotrb
for x in range (1403):


@kretson: taka pętla nie ma prawa się wykonywać w nieskończoność, więc pewnie czegoś nie napisałeś, najlepiej pokaż kod (najlepiej cały).
biwalencik
@kretson Rowna ilosc wierszy w df?
kretson
kretson
kretson Autor
0
@kretson: pojawia się ostrzeżenie :
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
self[name]
kretson
kretson
kretson Autor
0
@piotrb: nie ma prawa, a jednak coś tam się liczy ciągle bo używa procesora i nie chce się skończyć.
Robię nową kopię df w nowym skrypcie i wystarczy, że zrobię coś takiego, zwykłe przypisanie wartości przez for (bez sensu praktycznego, ale żeby sprawdzić czy działa):
for x in range(1400):
fdi3.iloc[x].com_relig = 5
I jest to samo.
BTW już sobie ogólnie poradziłem z problemem, ale bardzo na około, najlepiej jakby się
piotrb
@kretson: Bez pełnego kodu nie ma co siadać, bo ja to napiszę co opisałeś i zadziała. Jak nie chcesz kodu pokazywać, to po prostu użyj debuggera.
kretson
kretson
kretson Autor
0
@piotrb: Tam praktycznie nie ma kodu, ja używam tylko jupytera i pandasa do prostej obróbki danych. Mogę Ci wysłać ipynb i csv z tymi danymi (tam jest co chwilę in-out i ogólnie bałagan i tu ciężko wkleić) , ale to samo się dzieje jak robię zupełnie nowiutki skrypt:
Wczytuję csv jako dataframe i potem chcę zrobić to co wyżej.
biwalencik
@kretson: Wyglada mi na zadanie typu df.merge i potem groupby(religia). Pokaz jak wygladaja dane i co chcesz osiagnac.
kretson
kretson
kretson Autor
0
@biwalencik: Tak jak pisałem mam dwa df:
Pierwszy:
rel2.dtypes

Out[15]:
kretson
kretson
kretson Autor
0
@biwalencik: Nie, w tym fdi 6k a w rel2 jakieś 200. Pierwszy to pary krajów (i dla każdej kilka wierszy z różnych lat) , drugi ma tyle ile różnych krajów. Właśnie chodzi o to żeby tworząc nową kolumnę w tym co ma 6k i wpisując tam wyliczone wartości brał dane dla danego kraju z tego co ma 200.