Python 在不存在预先指定的条件的情况下插入数据帧

Python 在不存在预先指定的条件的情况下插入数据帧,python,pandas,Python,Pandas,我有一个大的数据集,我分组以获得一些摘要信息。其中一列引用了一个变量,我知道该变量应该包含每个条件的一组值,而不管是否观察到它。问题是,有些观测值不包含已知范围内的所有值,这意味着它们没有获得。我需要level变量的所有可能实例存在。运行df.groupby()意味着某些组合不存在,但我需要这些组合用于后续步骤。所以我特别想在一个条件缺少这个变量的实例时进行插值,并将零添加到另一列中。例如: test = pd.DataFrame({'condition':['a','a','a','b','b

我有一个大的数据集,我分组以获得一些摘要信息。其中一列引用了一个变量,我知道该变量应该包含每个条件的一组值,而不管是否观察到它。问题是,有些观测值不包含已知范围内的所有值,这意味着它们没有获得。我需要
level
变量的所有可能实例存在。运行
df.groupby()
意味着某些组合不存在,但我需要这些组合用于后续步骤。所以我特别想在一个条件缺少这个变量的实例时进行插值,并将零添加到另一列中。例如:

test = pd.DataFrame({'condition':['a','a','a','b','b','c','c','c'],
                     'level':[1,2,3,1,2,1,2,3],
                     'value':[6,0,11,4,10,9,14,9]})

    condition   level   value
0   a   1   6
1   a   2   12
2   a   3   11
3   b   1   4
4   b   2   10
5   c   1   9
6   c   2   14
7   c   3   9
级别为
[1,2,3]
,但正如您所看到的,如果条件等于
'b'
,则缺少
级别
3(例如)。我只想遍历整个数据帧,找到这样的行,填写编码和级别,并在这些情况下将值设置为
0
,以便最终结果如下所示:

    condition   level   value
0   a   1   6
1   a   2   12
2   a   3   11
3   b   1   4
4   b   2   10
5   b   3   0
6   c   1   9
7   c   2   14
8   c   3   9
我能想到的唯一方法是通过循环,获取观察到的级别,检查它们是否包含在完整的级别集合中,如果它们不都在那里,则向pandas添加一行所需的信息。我可以在最后把它分类。但我认为这将是非常低效的,因为在数据帧上循环。还有更好的主意吗


脚注:实际数据集中有多个
列,但如果没有这些列,则应将它们全部设置为零。

您可以取消堆叠,并用0填充值,然后重新堆叠:

test.set_index(['condition','level']).unstack(fill_value=0).stack().reset_index()
或与pivot_表类似

test.pivot_table(index='condition',columns='level',fill_value=0).stack().reset_index()


您可以
透视
堆栈

df=test.pivot(*test.columns).fillna(0).stack().reset_index()

谢谢,这项工作完全符合我的需要。这似乎“推断”了
level
可以基于所有
条件下整个列中存在的内容所承担的全部范围。是否可以以某种方式预先指定该值,以确保
level
接受所有可能的值,而不管它们是否存在于当前数据中?@fffrost IIUC,在取消堆栈后,您可以
reindex
,它还支持fill\u值来指定级别列表,然后堆栈,
df…unstack()。reindex(您的\u列表,fill\u value=0)。stack()
类似的内容您还需要reindex中的axis=1
,我在上一个注释代码中遗漏了它
df=test.pivot(*test.columns).fillna(0).stack().reset_index()