填写pandas数据帧中的缺失数据

时间:2016-02-03 15:59:13

标签: python pandas

我有一个带有两个索引的Pandas数据框

<div id="row" class="">
  <div class="form-group">
    <div class="control-label">
      <label for="names"><b> Select Name: </b>
      </label>
    </div>
    <div class="control-label">
      <select class="form-control" name="names" id="names">
        <option value="" disabled="disabled" label="Select a name"></option>
        <option value="1">Bradley</option>
        <option value="2">Anderson</option>
        <option value="3">Sonya</option>
      </select>
    </div>
    <div class="control-label">
      <label for="ranks"><b> Rank :  </b>
      </label>
      <input type="text" value="1" name="ranks" id="ranks" readonly="">
    </div>
  </div>
</div>

<div id="nextDiv"></div>

并希望 Column1 indexA indexB 1001 aaa 1 bbb 1 ccc 1 1002 ddd 1 eee 1 indexB的每个值设置相同的值:

indexA

我的第一个想法是取消堆叠,填充0然后堆叠它,但这看起来有点矫枉过正。有更简单的方法吗?

编辑:亚历山大的答案虽然需要很长时间(我的原始数据框有350k行),但仍然有效。我稍微改变了这个解决方案:

                              Column1
indexA   indexB                        
1001     aaa                        1
         bbb                        1
         ccc                        1
         ddd                        0
         eee                        0
1002     aaa                        0
         bbb                        0
         ccc                        0
         ddd                        1
         eee                        1

在发布这个问题之后还发现了这两个问题:

1 个答案:

答案 0 :(得分:2)

可能有更好的方法来做到这一点。我使用pd.MultiIndex.from_product创建了一个新的MultiIndex。然后我创建了一个带有虚拟值的新数据框,加入了现有的dtaframe,并删除了虚拟列。

df = pd.DataFrame({'index_0': ['a', 'a', 'b', 'b', 'b'], 
                   'index_1': ['A', 'B', 'A', 'B', 'C'], 
                   'vals': [1, 2, 3, 4, 5]}).set_index(['index_0', 'index_1'])

>>> df 
                 vals
index_0 index_1      
a       A           1
        B           2
b       A           3
        B           4
        C           5

idx = pd.MultiIndex.from_product([df.index.levels[0], df.index.levels[1]], 
                                 names=df.index.names)
new_df = pd.DataFrame({'_dummy_': [1] * len(idx)}, index=idx).join(df)
del new_df['_dummy_']

>>> new_df
                 vals
index_0 index_1      
a       A           1
        B           2
        C         NaN
b       A           3
        B           4
        C           5