【发布时间】:2020-03-03 02:08:26
【问题描述】:
我有一个通用格式的数据集:
group_id item_id zone time
1 1 1 1
1 3 4 1
2 6 3 1
2 2 4 1
3 1 1 1
1 2 3 2
1 6 2 2
2 8 1 2
2 5 2 2
3 1 1 2
我希望为区域列中的每个潜在值创建一个新列,然后如果它代表该行,则为其分配一个真值。假设有四个潜在区域,列在names = ['zone_1', 'zone_2', 'zone_3', 'zone_4'] 中。输出应该是这样的:
group_id item_id time zone_1 zone_2 zone_3 zone_4
1 1 1 1 0 0 0
1 3 1 0 0 0 1
2 6 1 0 0 1 0
2 2 1 0 0 0 1
3 1 1 1 0 0 0
1 2 2 0 0 1 0
1 6 2 0 1 0 0
2 8 2 1 0 0 0
2 5 2 0 1 0 0
3 1 2 1 0 0 0
我不确定如何最好地实现这一目标。我可以直接从名称列表中创建新列。我可以为区域创建一个适当的数组(例如,将区域值 3 替换为 [0,0,1,0]),然后在“区域”上的 pd.explode 后跟一个枢轴,但逐行替换是密集的而且不是很像熊猫。我感谢任何其他建议。
需要注意的是 group_id + item_id + time 创建了一个唯一的项目(没有两个项目在所有三个值上都相同)。
谢谢!
编辑:
澄清一下,正如我不清楚的那样:可能存在比列中唯一出现的更多潜在区域。例如,上述数据集可以与names = ['zone_1', 'zone_2', 'zone_3', 'zone_4', 'zone_5] 配对。即使数据框中没有区域 5 出现的实例,它也需要一个新列。理想情况下,解决方案还将为此创建一个列(用于以后的可视化目的)。这种情况下的输出是:
group_id item_id time zone_1 zone_2 zone_3 zone_4 zone_5
1 1 1 1 0 0 0 0
1 3 1 0 0 0 1 0
2 6 1 0 0 1 0 0
2 2 1 0 0 0 1 0
3 1 1 1 0 0 0 0
1 2 2 0 0 1 0 0
1 6 2 0 1 0 0 0
2 8 2 1 0 0 0 0
2 5 2 0 1 0 0 0
3 1 2 1 0 0 0 0
【问题讨论】: