我有一个大的数据集,我将其分组以获取一些摘要信息。其中一列是指一个变量,我知道该变量应包含每个条件的一组值,无论是否观察到该变量。问题是某些观察值未包含已知范围内的所有值,这意味着它们不是获得的。我需要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
列,但如果不存在,则应将它们全部设置为零。
答案 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