使用现有 DataFrame 创建匹配表的最佳方法

问题描述

我正在寻找使用现有 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   ...

或者,您可以只使用 dfreshape,而不是使用整个 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