问题描述
我正在寻找使用现有 Pandas DataFrame 创建匹配表的最佳方法。对于每两行(一对),它应该将 next 条目附加到第一项,对于第二项,它应该附加 prevIoUs 条目。
输入:
I Name Var ...
0 A Var1 ...
1 B Var2 ...
2 C Var3 ...
3 D Var4 ...
4 E Var5 ...
5 F Var6 ...
期望输出(对):
I Name_1 Var_1 ..._1 Name_2 Var_2 ..._2
0 A Var1 ... B Var2 ...
1 B Var2 ... A Var1 ...
2 C Var3 ... D Var4 ...
3 D Var4 ... C Var3 ...
4 E Var5 ... F Var6 ...
5 F Var6 ... E Var5 ...
提前致谢!
解决方法
您可以尝试重塑它并恢复沿轴 = 1 的值,然后使用 pd.concat
恢复 add_suffix
:
>>> df2 = pd.DataFrame(
data=df.to_numpy().reshape(df.shape[0]//2,2,df.shape[1])[:,::-1,:].reshape(df.shape),columns=df.columns
)
>>> pd.concat([df.add_suffix('_1'),df2.add_suffix('_2')],axis=1)
Name_1 Var_1 ..._1 Name_2 Var_2 ..._2
0 A Var1 ... B Var2 ...
1 B Var2 ... A Var1 ...
2 C Var3 ... D Var4 ...
3 D Var4 ... C Var3 ...
4 E Var5 ... F Var6 ...
5 F Var6 ... E Var5 ...
或者,您可以只使用 df
和 reshape
,而不是使用整个 index
:
reindex
,
IIUC,您可以非常简单地使用 shift
和一些简单的操作来达到您想要的结果:
# Shift both variables by 1
df[['Name_2','Var_2']] = df[['Name','Var']].shift(-1,axis=0)
# Replace odd indexed rows of the last 2 columns,with even indexed rows of the first 2 columns
df.iloc[1::2,-2:] = df.iloc[::2,:2]
# Rename
df.rename(columns={'Name':'Name_1','Var':'Var_1'},inplace=True)
df
Out[69]:
Name_1 Var_1 Name_2 Var_2
0 A Var1 B Var2
1 B Var2 A Var1
2 C Var3 D Var4
3 D Var4 C Var3
4 E Var5 F Var6
5 F Var6 E Var5
这将为您提供配对。不确定这是你需要的,但我想我会发布它。
,让我们用 argsort
尝试一些新的东西:
i = np.argsort(df.index[::-1] // 2)[::-1]
df.join(df.iloc[i].reset_index(drop=True),lsuffix='_1',rsuffix='_2')
Name_1 Var_1 Name_2 Var_2
0 A Var1 B Var2
1 B Var2 A Var1
2 C Var3 D Var4
3 D Var4 C Var3
4 E Var5 F Var6
5 F Var6 E Var5