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