问题描述
我有一张表,其中列出了每个主体ID的辅助ID总数。因此,我需要生成第二张表,其中每一行对应于主要ID和次要ID的组合。例如,如果对于主ID1,我有5个作为辅助ID,则我需要5行,每行具有相同的主ID,第二个ID从1到5。这样做需要很多时间,所以我想知道是否有一种更有效的方式来执行此操作而不涉及循环。
视觉示例:
表格
表格输出
解决方法
您可以将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