我想用熊猫做一个闭合表。假设您有分层数据,类似这样的数据具有给定的ID:
df = pd.DataFrame(
{
'unit_0': ['A','A','A','A','A','A','A','A'],
'unit_1': ['B','C','C','C','D','D','E','E'],
'unit_2': ['F','G','G','H','I','I','J','J']
}
)
units = [col for col in df]
closure = (df[units].melt(var_name='depth')
.drop_duplicates()
.rename(columns={'value': 'unit_name'}))
closure['unit_name_id'] = range(0, len(closure))
现在我想给表parent_unit_id
一个如下的东西:
depth unit_name unit_name_id parent_unit_id
unit_0 A 0
unit_1 B 1 0
unit_1 C 2 0
unit_1 D 3 0
unit_1 E 4 0
unit_2 F 5 1
unit_2 G 6 2
unit_2 H 7 2
unit_2 I 8 3
unit_2 J 9 4
在本例中,每个子对象只有一个父对象,但如果帧看起来像这样(单位_2中的最后一个J变为I),该怎么办
df = pd.DataFrame(
{
'unit_0': ['A','A','A','A','A','A','A','A'],
'unit_1': ['B','C','C','C','D','D','E','E'],
'unit_2': ['F','G','G','H','I','I','J','I']
}
)
因此,I的parent_unit_id
将是一个列表[3, 4]
下面应该可以做到这一点:
注意,这使用了
pd.Series.apply()
,它在内部迭代所有行,因此速度很慢。如果您需要一个更快的解决方案,请告诉我,我们也可以使用merge
和groupby
来加快速度只需构建(前置)图并将其映射到
unit_name_id
列:输出
将
I
与J
交换产生:比较两种解决方案得出以下结果:
对于较大的数据帧,差异可能会增加。比较解决方案的代码可以在here中找到
相关问题 更多 >
编程相关推荐