Python pandas pos_explode-数组的最新列,但保留索引
我想在pandas中使用类似pos_explode的东西,即在原始数组中保留元素的索引Python pandas pos_explode-数组的最新列,但保留索引,python,arrays,pandas,Python,Arrays,Pandas,我想在pandas中使用类似pos_explode的东西,即在原始数组中保留元素的索引 df = pd.DataFrame({'metric': {24: 53, 68: 93, 86: 38}, 'label': {24: 1, 68: 1, 86: 1}, 'group_1': {24: 1, 68: 1, 86: 1}, 'group_2': {24: 1, 68: 1, 86: 1}, 'metric_group_0': {24: np.array([72, 41, 96]),
df = pd.DataFrame({'metric': {24: 53, 68: 93, 86: 38},
'label': {24: 1, 68: 1, 86: 1},
'group_1': {24: 1, 68: 1, 86: 1},
'group_2': {24: 1, 68: 1, 86: 1},
'metric_group_0': {24: np.array([72, 41, 96]),
68: np.array([85, 56, 33]),
86: np.array([26, 85, 26])}})
df = df.reset_index(drop=True)
df = df.reset_index(drop=False)
df = df.set_index(['index'])
display(df)
s=pd.DataFrame({'metric_group_0':np.concatenate(df.metric_group_0.values)},index=df.index.repeat(df.metric_group_0.str.len()))
display(s)
s.join(df.drop('metric_group_0',1),how='left')
这会爆炸数据,但会丢失索引。如何将索引保留为附加列?
也就是说,在本例中,每个pandas.Index
的值为[1,2,3]
metric label group_1 group_2 metric_group_0
index
0 53 1 1 1 [72, 41, 96]
1 93 1 1 1 [85, 56, 33]
2 38 1 1 1 [26, 85, 26]
当前转换为:
metric_group_0 metric label group_1 group_2
index
0 72 53 1 1 1
0 41 53 1 1 1
0 96 53 1 1 1
1 85 93 1 1 1
1 56 93 1 1 1
1 33 93 1 1 1
2 26 38 1 1 1
2 85 38 1 1 1
2 26 38 1 1 1
但缺少原始索引。
所需的输出如下所示:
metric_group_0 metric label group_1 group_2 pos_in_array
index
0 72 53 1 1 1 1
0 41 53 1 1 1 2
0 96 53 1 1 1 3
1 85 93 1 1 1 1
1 56 93 1 1 1 2
1 33 93 1 1 1 3
2 26 38 1 1 1 1
2 85 38 1 1 1 2
2 26 38 1 1 1 3
您可以使用创建此列,我们使用
索引作为组:
df['pos_in_array'] = df.groupby(df.index).cumcount()+1
因此,您的整个代码如下所示,因为您尚未将新创建的数据帧分配到变量中:
df = df.reset_index(drop=True)
df = df.reset_index(drop=False)
df = df.set_index(['index'])
s=pd.DataFrame({'metric_group_0':np.concatenate(df.metric_group_0.values)},
index=df.index.repeat(df.metric_group_0.str.len()))
df = s.join(df.drop('metric_group_0',1),how='left')
df['pos_in_array'] = df.groupby(df.index).cumcount()+1
您可以使用创建此列,我们使用索引作为组:
df['pos_in_array'] = df.groupby(df.index).cumcount()+1
因此,您的整个代码如下所示,因为您尚未将新创建的数据帧分配到变量中:
df = df.reset_index(drop=True)
df = df.reset_index(drop=False)
df = df.set_index(['index'])
s=pd.DataFrame({'metric_group_0':np.concatenate(df.metric_group_0.values)},
index=df.index.repeat(df.metric_group_0.str.len()))
df = s.join(df.drop('metric_group_0',1),how='left')
df['pos_in_array'] = df.groupby(df.index).cumcount()+1