我遇到一个问题,当我将数据透视表应用于空数据框时,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)
移至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
问题来源:stackoverflow
希望这可以帮助。可能有一种更好的有效方法,但这对您的数据集有效。我无法正确处理的一件事是在合并后仅保留匹配的列值,但是我以另一种方式对其进行了管理(希望这是不正确的)
我在这里所做的只是创建一个具有所需列和索引的空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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。