【问题标题】:Filling in missing data in pandas dataframe填充熊猫数据框中的缺失数据
【发布时间】:2016-02-04 02:39:27
【问题描述】:

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

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

并且希望indexBindexA 的每个值具有相同的值:

                              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

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

编辑: Alexander 在下面的回答虽然需要很长时间(我的原始数据框有 350k 行)但有效。我稍微改变了这个解决方案:

df =  pd.read_sql(sql=sql, con=db_eng, index_col=index)
idx = pd.MultiIndex.from_product([df.index.levels[0], df.index.levels[1]], names=df.index.names)
df.reindex(idx).fillna(value=0)

发布后也发现了这两个问题:

【问题讨论】:

  • 不,这似乎是一种合乎逻辑的方式。您还可以合并两个数据框(对应于不同的值)并填充 nas,但它不会更短。我必须说,你在这里描述的内容似乎并不长。

标签: python pandas


【解决方案1】:

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

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

【讨论】:

  • 这行得通,虽然它似乎并不比unstack().fillna(0).stack()快多少
  • df.unstack().stack(dropna=False) 和可选的.fillna(0) 可能是最简单的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-06
  • 1970-01-01
  • 2017-08-21
  • 2021-12-10
  • 2018-08-14
  • 2016-04-30
相关资源
最近更新 更多