Python 熊猫*高效*按组将有效值复制到其他行
“过早的优化是万恶之源(但一旦你有了一个丑陋的解决方案,拥有它是很好的)”D.克努特 鉴于此数据集Python 熊猫*高效*按组将有效值复制到其他行,python,pandas,dataframe,nan,Python,Pandas,Dataframe,Nan,“过早的优化是万恶之源(但一旦你有了一个丑陋的解决方案,拥有它是很好的)”D.克努特 鉴于此数据集 从io导入StringIO 作为pd进口熊猫 csv=StringIO(“”“国家、年份、地表、地面、总水量、环境,视情况而定 也门,2012,2,1.5,2.1,0.55,0 也门,2013,,,,, 也门,2014,2,1.5,2.1,0 也门,2015年,,,,, 也门,2016,,,,, 也门,2017,,,0.55, 赞比亚,1995年,,,,, 赞比亚,1996年,,,,, 赞比亚,1
从io导入StringIO
作为pd进口熊猫
csv=StringIO(“”“国家、年份、地表、地面、总水量、环境,视情况而定
也门,2012,2,1.5,2.1,0.55,0
也门,2013,,,,,
也门,2014,2,1.5,2.1,0
也门,2015年,,,,,
也门,2016,,,,,
也门,2017,,,0.55,
赞比亚,1995年,,,,,
赞比亚,1996年,,,,,
赞比亚,1997104.8,47104.8,31.48,23.47“
df=pd.read\U csv(csv)
df
输出[0]:
国家年地表水环境
0也门2012 2.0 1.5 2.1 0.55 0.00
1也门2013年南部
2也门2014 2.0 1.5 2.1 NaN 0.00
3也门2015年南部
4也门2016年南部
5也门2017年南部0.55南部
6赞比亚1995南南南
7赞比亚1996年南部
8赞比亚1997 104.8 47.0 104.8 31.48 23.47
我想应用['surface','ground','tot_water','enviro']
列中的有效值,并将它们复制到所有国家/地区。我有一个解决方案,但它可以做一些优化
伪代码:
vars][surface',ground',tot_water',enviro']
#每个国家
对于df.country.unique()中的国家:
#以及
过滤器=df.country==国家
对于变量中的变量:
valid_ix=df[filter_uu][var]。第一个有效索引()
df.loc[filter_u,var]=df[var][valid_ix]
df
出[]:
国家年地表水环境
0也门2012 2.0 1.5 2.1 0.55 0.00
1也门2013 2.0 1.5 2.1 0.55南
2也门2014 2.0 1.5 2.1 0.55 0.00
3也门2015 2.0 1.5 2.1 0.55 NaN
4也门2016 2.0 1.5 2.1 0.55 NaN
5也门2017 2.0 1.5 2.1 0.55 NaN
6赞比亚1995 104.8 47.0 104.8 31.48南
7赞比亚1996 104.8 47.0 104.8 31.48南部
8赞比亚1997 104.8 47.0 104.8 31.48 23.47
必须有一种更有效的方法。在中等大小的数据集上,这需要相当长的时间,for循环很难看。任何建议/帮助都将不胜感激 您可以按国家对数据进行分组,并使用bfill和ffill
df.groupby('country').bfill().ffill()
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 0.00
2 Yemen 2014 2.0 1.5 2.1 0.55 0.00
3 Yemen 2015 2.0 1.5 2.1 0.55 0.00
4 Yemen 2016 2.0 1.5 2.1 0.55 0.00
5 Yemen 2017 2.0 1.5 2.1 0.55 0.00
6 Zambia 1995 104.8 47.0 104.8 31.48 23.47
7 Zambia 1996 104.8 47.0 104.8 31.48 23.47
8 Zambia 1997 104.8 47.0 104.8 31.48 23.47
你的逻辑不太清楚。您想用第一个真值替换所有值还是按国家/地区替换所有值?为什么要覆盖索引8中的值?很好!这不应该发生,应该用国家来取代价值观