Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 旋转空数据帧会生成列多索引_Python 3.x_Pandas_Pivot Table - Fatal编程技术网

Python 3.x 旋转空数据帧会生成列多索引

Python 3.x 旋转空数据帧会生成列多索引,python-3.x,pandas,pivot-table,Python 3.x,Pandas,Pivot Table,我遇到了一个问题,pivot\u table在我将其应用于空数据帧时为列生成多索引而不是索引 这就是我要做的。我有一些数据正在读入数据帧df。这个数据帧的一列是'type',我需要的是根据df列中的类型将数据帧df分为两个数据帧df2和df3。虽然我传入以创建df的数据大部分时间都有两种类型(下面的类型'A'和'B'),但有时我可能会丢失另一种类型的值 但是,我需要从每个数据透视表中创建一个数据透视表,并添加缺少的列和索引,必要时填充0。当数据中没有缺少类型时,这很好:我可以使用.reindex

我遇到了一个问题,
pivot\u table
在我将其应用于空数据帧时为列生成多索引而不是索引

这就是我要做的。我有一些数据正在读入数据帧
df
。这个数据帧的一列是
'type'
,我需要的是根据
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(列表(范围(6,9)),axis=0,fill_value=0)链接到
df2
df3
。但这会产生一个错误,因为
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

希望这有帮助。也许有一种更有效的方法可以做到这一点,但这适用于您的数据集。有一件事我没有弄清楚,那就是合并后只保留匹配的列值,但我用另一种方式管理了它(希望这不对)

我在这里所做的就是创建一个带有所需列和索引的空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:

df3:


我想您可以创建一个带有所需列和索引的空df(如-
pd.DataFrame(列=['a','b','c','d',索引=[6,7,8])
),并在合并后将其与
df2
df3
合并。fillna(0)
     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
     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