代码之家  ›  专栏  ›  技术社区  ›  rahlf23

为in multiindex dataframe和fillna创建新列

  •  0
  • rahlf23  · 技术社区  · 8 年前

    假设我有以下多索引数据帧,由以下代码生成:

    import pandas as pd, numpy as np
    
    names = ['Name1','Name2','Name3','Name4']
    values = ['x1','x2','x3','x4']
    categories = ['y1','y2','y3']
    
    x1 = pd.Series([0, 0, 0], index=categories)
    
    index = pd.MultiIndex.from_product([names, values]); placeholders = np.zeros((len(names)*len(values), len(categories)))
    
    df = pd.DataFrame(placeholders, index=index, columns=categories)
    
    for i in names:
        for j in values:
            df.loc[i,j] = x1
    
               y1   y2   y3
    Name1 x1  0.0  0.0  0.0
          x2  0.0  0.0  0.0
          x3  0.0  0.0  0.0
          x4  0.0  0.0  0.0
    Name2 x1  0.0  0.0  0.0
          x2  0.0  0.0  0.0
          x3  0.0  0.0  0.0
          x4  0.0  0.0  0.0
    Name3 x1  0.0  0.0  0.0
          x2  0.0  0.0  0.0
          x3  0.0  0.0  0.0
          x4  0.0  0.0  0.0
    Name4 x1  0.0  0.0  0.0
          x2  0.0  0.0  0.0
          x3  0.0  0.0  0.0
          x4  0.0  0.0  0.0
    

    我如何使用如下词典来填充该列 y3 对应行 x1 和填充 np.nan 中任何其他行的值 Y3年 列或当给定的名称(即name1、name2、name3等)不是字典中的键时?

    {'Name1': 54, 'Name3': 50}
    

    预期输出(0可以是 新南威尔士州 )以下内容:

               y1   y2   y3
    Name1 x1  0.0  0.0   54
          x2  0.0  0.0  0.0
          x3  0.0  0.0  0.0
          x4  0.0  0.0  0.0
    Name2 x1  0.0  0.0  0.0
          x2  0.0  0.0  0.0
          x3  0.0  0.0  0.0
          x4  0.0  0.0  0.0
    Name3 x1  0.0  0.0   50
          x2  0.0  0.0  0.0
          x3  0.0  0.0  0.0
          x4  0.0  0.0  0.0
    Name4 x1  0.0  0.0  0.0
          x2  0.0  0.0  0.0
          x3  0.0  0.0  0.0
          x4  0.0  0.0  0.0
    
    3 回复  |  直到 8 年前
        1
  •  1
  •   CT Zhu    8 年前

    惯用的方法可能是 update

    In [31]: df2 = pd.DataFrame({(k,'x1'): {'y3': v} for k, v in d.items()}).T
    
    In [32]: df2
    Out[32]: 
              y3
    Name1 x1  54
    Name3 x1  50
    
    In [33]: df.update(df2)
    
    In [34]: df
    Out[34]: 
               y1   y2    y3
    Name1 x1  0.0  0.0  54.0
          x2  0.0  0.0   0.0
          x3  0.0  0.0   0.0
          x4  0.0  0.0   0.0
    Name2 x1  0.0  0.0   0.0
          x2  0.0  0.0   0.0
          x3  0.0  0.0   0.0
          x4  0.0  0.0   0.0
    Name3 x1  0.0  0.0  50.0
          x2  0.0  0.0   0.0
          x3  0.0  0.0   0.0
          x4  0.0  0.0   0.0
    Name4 x1  0.0  0.0   0.0
          x2  0.0  0.0   0.0
          x3  0.0  0.0   0.0
          x4  0.0  0.0   0.0
    
        2
  •  1
  •   BENY    8 年前

    您可以创建更新df,然后使用 update

    d={'Name1': 54, 'Name3': 50}
    updatedf=pd.DataFrame(data=list(d.values()),columns=['y3'],index=pd.MultiIndex.from_arrays([list(d.keys()),['x1','x1']]))
    df.update(updatedf)
    df
    Out[229]: 
               y1   y2    y3
    Name1 x1  0.0  0.0  54.0
          x2  0.0  0.0   0.0
          x3  0.0  0.0   0.0
          x4  0.0  0.0   0.0
    Name2 x1  0.0  0.0   0.0
          x2  0.0  0.0   0.0
          x3  0.0  0.0   0.0
          x4  0.0  0.0   0.0
    Name3 x1  0.0  0.0  50.0
          x2  0.0  0.0   0.0
          x3  0.0  0.0   0.0
          x4  0.0  0.0   0.0
    Name4 x1  0.0  0.0   0.0
          x2  0.0  0.0   0.0
          x3  0.0  0.0   0.0
          x4  0.0  0.0   0.0
    
        3
  •  0
  •   YOLO    8 年前

    有很多方法可以做到这一点,一个简单的方法是使用 .loc 索引器:

    d = {'Name1': 54, 'Name3': 50}
    
    for i in d.keys():
        df.loc[i,'x1']['y3'] = d[i]