1 回答
TA贡献1847条经验 获得超7个赞
这是实现问题第一部分预期结果的一种方法,第二部分在以预期格式获取数据后应该是直截了当的。
1. 预处理
预处理表 B,使其每个 ID 都有一行。您可以执行groupbyB_ID_1 并传递一个函数来展平组:
def flatten_group(x):
n = len(x)
vals = x.iloc[:,1:].values.flatten().reshape(1, -1)
names = np.char.add(
np.array(['B_Value_1_', 'B_Value_2_']*n),
np.repeat(np.arange(1, n+1).astype(str), 2)
)
return pd.DataFrame(data=vals, columns=names)
b_prep = b.groupby('B_ID_1').apply(flatten_group).reset_index(level=0)
2.左连接
在这里你只需做一个左连接
pd.merge(a,b_prep,how='left', left_on='ID_1', right_on='B_ID_1').drop('B_ID_1', axis=1)
细节
b_prep
B_ID_1 B_Value_1_1 B_Value_2_1 B_Value_1_2 B_Value_2_2 B_Value_1_3 \
0 1 abcd N_1 abc N_2 NaN
0 3 GHI_1 N_3 GHI_2 N_3 GHI_3
B_Value_2_3 B_Value_1_4 B_Value_2_4
0 NaN NaN NaN
0 N_3 GHI_4 N_3
pd.merge
ID_1 Value_1 Value_2 B_Value_1_1 B_Value_2_1 B_Value_1_2 B_Value_2_2 \
0 1 ABC N_1 abcd N_1 abc N_2
1 2 DEF N_2 NaN NaN NaN NaN
2 3 GHI N_3 GHI_1 N_3 GHI_2 N_3
B_Value_1_3 B_Value_2_3 B_Value_1_4 B_Value_2_4
0 NaN NaN NaN NaN
1 NaN NaN NaN NaN
2 GHI_3 N_3 GHI_4 N_3
添加回答
举报
