"Преждевременная оптимизация - корень всего зла (но приятно иметь некогда уродливое решение)" D.Knuth
Учитывая этот набор данных
from io import StringIO
import pandas as pd
csv = StringIO("""country,year,surface,ground,tot_water,enviro,depend
Yemen,2012,2,1.5,2.1,0.55,0
Yemen,2013,,,,,
Yemen,2014,2,1.5,2.1,,0
Yemen,2015,,,,,
Yemen,2016,,,,,
Yemen,2017,,,,0.55,
Zambia,1995,,,,,
Zambia,1996,,,,,
Zambia,1997,104.8,47,104.8,31.48,23.47""")
df = pd.read_csv(csv)
df
Out[0]:
country year surface ground tot_water enviro depend
0 Yemen 2012 2.0 1.5 2.1 0.55 0.00
1 Yemen 2013 NaN NaN NaN NaN NaN
2 Yemen 2014 2.0 1.5 2.1 NaN 0.00
3 Yemen 2015 NaN NaN NaN NaN NaN
4 Yemen 2016 NaN NaN NaN NaN NaN
5 Yemen 2017 NaN NaN NaN 0.55 NaN
6 Zambia 1995 NaN NaN NaN NaN NaN
7 Zambia 1996 NaN NaN NaN NaN NaN
8 Zambia 1997 104.8 47.0 104.8 31.48 23.47
Я хочу применить допустимые значения из столбцов ['surface', 'ground', 'tot_water', 'enviro']
и скопировать их во все страны.У меня есть решение, но оно могло бы помочь с оптимизацией.
Псевдокод:
- Перебрать каждую страну и отфильтровать кадр данных по этому подмножеству
- найти индексдля первого действительного значения этого столбца
- установите значение для этого столбца равным этому действительному значению
Мое решение
vars_ = ['surface', 'ground', 'tot_water', 'enviro']
# for each country
for country in df.country.unique():
# and each value in the
filter_ = df.country == country
for var in vars_:
valid_ix = df[filter_][var].first_valid_index()
df.loc[filter_, var] = df[var][valid_ix]
df
Out[]:
country year surface ground tot_water enviro depend
0 Yemen 2012 2.0 1.5 2.1 0.55 0.00
1 Yemen 2013 2.0 1.5 2.1 0.55 NaN
2 Yemen 2014 2.0 1.5 2.1 0.55 0.00
3 Yemen 2015 2.0 1.5 2.1 0.55 NaN
4 Yemen 2016 2.0 1.5 2.1 0.55 NaN
5 Yemen 2017 2.0 1.5 2.1 0.55 NaN
6 Zambia 1995 104.8 47.0 104.8 31.48 NaN
7 Zambia 1996 104.8 47.0 104.8 31.48 NaN
8 Zambia 1997 104.8 47.0 104.8 31.48 23.47
Должно бытьболее эффективный способ.На наборе данных среднего размера это занимает довольно много времени, и циклы for неприглядны.Любой совет / помощь будет принята с благодарностью!