在不存在预定条件的情况下插值熊猫数据框

时间:2020-05-03 13:43:22

标签: python pandas

我有一个大的数据集,我将其分组以获取一些摘要信息。其中一列是指一个变量,我知道该变量应包含每个条件的一组值,无论是否观察到该变量。问题是某些观察值未包含已知范围内的所有值,这意味着它们不是获得的。我需要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'的地方,level 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

我能想到的唯一方法是循环遍历,获取观察到的级别,检查它们是否包含在整个级别集中,如果它们不全都包含在其中,则在大熊猫后面附加一行信息。然后我可以对它进行排序。但是我认为由于在数据帧上循环,这将是非常低效的。还有更好的主意吗?

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

2 个答案:

答案 0 :(得分:3)

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

test.set_index(['condition','level']).unstack(fill_value=0).stack().reset_index()

或与pivot_table类似

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

  condition  level  value
0         a      1      6
1         a      2      0
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

答案 1 :(得分:3)

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

outer