开发者社区> 问答> 正文

透视一个空的数据框会产生一列MULTIindex

我遇到一个问题,当我将数据透视表应用于空数据框时,pivot_table会为该列生成MultiIndex而不是索引。

所以这就是我想要做的。我有一些数据正在读入数据框df中。该数据帧的一列是“类型”,我需要根据df列中的类型将数据帧df分为两个数据帧df2和df3。虽然在大多数情况下,我传入的用于创建df的数据会同时具有两种类型(以下分别为类型“ A”和“ B”),但有时我可能会缺少另一种类型的值。

但是,我需要从每个数据透视表创建缺失的列和索引,并在必要时填充为0。当数据中不缺少类型时,这很好:我可以使用两次.reindex来填写缺少的索引和列。但是如果类型完全丢失,则派生的数据帧之一(以下为df2或df3)将为空。在这种情况下,索引最终将成为多索引。

这是一个例子

import pandas as pd
df = pd.DataFrame({'type': ['A', 'A', 'A'], 'val': [1, 2, 3], 'col': ['a', 'b', 'a'], 'ind': [6, 6, 8]})
df2 = df[df['type'] == 'A'][['val', 'col', 'ind']].pivot_table(values='val', index='ind', columns='col', fill_value=0)
df3 = df[df['type'] == 'B'][['val', 'col', 'ind']].pivot_table(values='val', index='ind', columns='col', fill_value=0)

我现在想做的是链.reindex(['a','b','c','d'],axis = 1,fill_value = 0).reindex(list(range(6 ,9)),axis = 0,fill_value = 0)移至df2df3上。但这会产生错误,因为df3的列索引是MultiIndex([],names = [None,'col'])而不是Index([],name ='col')。而且,我似乎不能只删除None,因为诸如.drop(columns = None)`之类的东西显然不会/不起作用。

有没有一种有效而简单的方法来处理此问题?

*为了将问题简化一下,以防万一我真正应该做的是重构整个事情,我拥有的数据看起来像这样 {'type': ['A', 'A', 'A'], 'val': [1, 2, 3], 'col': ['a', 'b', 'a'], 'ind': [6, 6, 8]}

“类型”列表可以同时包括或不包括“ A”和“ B”两种类型。

由此,我需要创建两个单独的数据帧以分别捕获类型“ A”和“ B”的信息,这些信息足够健壮,可以在缺少任何一种时进行处理。上面的示例生成的数据帧应类似于此。

df2 = 
    'a' 'b' 'c' 'd'
6    1   2   0   0
7    0   0   0   0
8    3   0   0   0

and

df3 =
    'a' 'b' 'c' 'd'
6    0   0   0   0
7    0   0   0   0
8    0   0   0   0

问题来源:stackoverflow

展开
收起
is大龙 2020-03-24 14:52:55 523 0
1 条回答
写回答
取消 提交回答
  • 希望这可以帮助。可能有一种更好的有效方法,但这对您的数据集有效。我无法正确处理的一件事是在合并后仅保留匹配的列值,但是我以另一种方式对其进行了管理(希望这是不正确的)

    我在这里所做的只是创建一个具有所需列和索引的空df,并在合并后将其与您的df2和df3以及.fillna(0)合并。

        import pandas as pd
        df = pd.DataFrame({'type': ['A', 'A', 'A'], 'val': [1, 2, 3], 'col': ['a', 'b', 'a'], 'ind': [6, 6, 8]})
    
        df1 = pd.DataFrame(columns=['a', 'b', 'c', 'd'], index=[6, 7, 8])
    
        df2 = df1.merge(df[df['type'] == 'A'][['val', 'col', 'ind']].pivot_table(values='val', index='ind', columns='col', fill_value=0),
                        left_index=True, right_index=True, how='left', suffixes=('','_y')).fillna(0.0)
    
        df3 = df1.merge(df[df['type'] == 'B'][['val', 'col', 'ind']].pivot_table(values='val', index='ind', columns='col', fill_value=0),
                        left_index=True, right_index=True, how='left').fillna(0.0)
    
    # this section need rework as I mentioned above
        df2['a'], df2['b'] = df2['a_y'], df2['b_y']
        df2 = df2.drop(['a_y', 'b_y'],1)
    
        print(df2)
        print(df3)
    

    输出:

    df2:

         a    b    c    d
    6  1.0  2.0  0.0  0.0
    7  0.0  0.0  0.0  0.0
    8  3.0  0.0  0.0  0.0
    

    df3:

         a    b    c    d
    6  0.0  0.0  0.0  0.0
    7  0.0  0.0  0.0  0.0
    8  0.0  0.0  0.0  0.0
    

    回答来源:stackoverflow

    2020-03-24 14:55:06
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载