【问题标题】:Pandas- use lists to populate additional values for last level of multi-indexPandas - 使用列表填充最后一级多索引的附加值
【发布时间】:2020-06-04 21:26:37
【问题描述】:

所以我有一个数据框

带有站点“STA”列表(任意长度)和每个河流站点“RS”的高程“Z”。它的索引是['River','Reach','RS','Weir STA']。

我需要为每个“RS”,为“STA”列表中与该“RS”对应的每个项目添加一个额外的行。此行需要具有该“STA”项目值的“Weir STA”,和 0 或 NaN 的“Weir Elev”。

我一直在尝试不同的嵌套组合 对于 DF.groupby(level=0) 中的 i,df 以及附加,堆栈,融化等的不同组合,但无法弄清楚。现在,如果我想将“Z”的值用于“Weir Elev”,我将如何进行此操作?

【问题讨论】:

    标签: python pandas multi-index


    【解决方案1】:

    好的,@MaxU 有一个可以解决问题的函数!

    这里的数据框“weirr”是上面没有列['STA','Z']的DF,数据框“se”是列['STA','Z']及其正确的['River',' Reach','RS'] 索引。

    def explode(df, lst_cols, fill_value='', preserve_index=False):
        #https://stackoverflow.com/questions/12680754/split-explode-pandas-dataframe-string-entry-to-separate-rows/40449726#40449726
        # make sure `lst_cols` is list-alike
        if (lst_cols is not None
            and len(lst_cols) > 0
            and not isinstance(lst_cols, (list, tuple, np.ndarray, pd.Series))):
            lst_cols = [lst_cols]
        # all columns except `lst_cols`
        idx_cols = df.columns.difference(lst_cols)
        # calculate lengths of lists
        lens = df[lst_cols[0]].str.len()
        # preserve original index values    
        idx = np.repeat(df.index.values, lens)
        # create "exploded" DF
        res = (pd.DataFrame({
                    col:np.repeat(df[col].values, lens)
                    for col in idx_cols},
                    index=idx)
                 .assign(**{col:np.concatenate(df.loc[lens>0, col].values)
                                for col in lst_cols}))
        # append those rows that have empty lists
        if (lens == 0).any():
            # at least one list in cells is empty
            res = (res.append(df.loc[lens==0, idx_cols], sort=False)
                      .fillna(fill_value))
        # revert the original index order
        res = res.sort_index()
        # reset index if requested
        if not preserve_index:        
            res = res.reset_index(drop=True)
        return res
    
    se=se.reset_index()
    se = explode(se,['STA','Z']).set_index(['River','Reach','RS'])
    se = se.rename(columns={'STA':'Weir STA'})
    weirr = weirr.set_index('Weir STA', append=True)
    weirr = pd.concat([weirr,se],sort=True)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-17
      • 1970-01-01
      • 2016-11-30
      • 2021-04-20
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      相关资源
      最近更新 更多