Python 熊猫*高效*按组将有效值复制到其他行

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

“过早的优化是万恶之源(但一旦你有了一个丑陋的解决方案,拥有它是很好的)”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年,,,,,
赞比亚,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中的值?很好!这不应该发生,应该用国家来取代价值观