如何生成具有来自Python范围中的ID之一的交叉联接表?

问题描述

我有一张表,其中列出了每个主体ID的辅助ID总数。因此,我需要生成第二张表,其中每一行对应于主要ID和次要ID的组合。例如,如果对于主ID1,我有5个作为辅助ID,则我需要5行,每行具有相同的主ID,第二个ID从1到5。这样做需要很多时间,所以我想知道是否有一种更有效的方式来执行此操作而不涉及循环。

视觉示例:

表格

enter image description here

表格输出

enter image description here

解决方法

您可以将np.repeat.groupby一起使用:

df_out = pd.DataFrame( np.repeat(df['ID'],df['Number_of_IDs']) )
df_out['ID2'] = df_out.groupby(df_out['ID'])['ID'].transform(lambda x: range(len(x))) + 1

print(df_out)

打印:

    ID  ID2
0  ID1    1
0  ID1    2
0  ID1    3
1  ID2    1
1  ID2    2
2  ID3    1
3  ID4    1
3  ID4    2

或者:

df_out = pd.DataFrame( np.repeat(df['ID'],df['Number_of_IDs']) )
df_out['ID2'] = 1
df_out['ID2'] = df_out.groupby(df_out['ID'])['ID2'].cumsum()

print(df_out)
,

您可以在ID数量上应用lambda函数,然后在数据框上使用explode

df['Number_of_IDs'] = df['Number_of_IDs'].apply(lambda x : range(1,x+1))
df = df.explode('Number_of_IDs'))
df = df.rename(columns={'Number_of_IDs': 'ID2'})

输出-

   ID   ID2
0  ID1    1
0  ID1    2
0  ID1    3
1  ID2    1
1  ID2    2
2  ID3    1
3  ID4    1
3  ID4    2

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...