Python 数据帧映射练习

Python 数据帧映射练习,python,pandas,dataframe,Python,Pandas,Dataframe,我刚开始使用Python,我做了一个简单的练习。 我有3个数据帧,如下所示: df1: A B C 0 1 2 3 1 4 5 6 D E F G H 0 1 m1 m2 m3 m4 m5 0 D F H 1 A B C D E F G H 0 1 2 3 1 4 5 6 df2(空): A B C 0 1 2 3 1 4 5 6

我刚开始使用Python,我做了一个简单的练习。 我有3个数据帧,如下所示:

df1:

   A B C         
 0 1 2 3           
 1 4 5 6    
   D E F G H
0
1
   m1 m2 m3 m4 m5
0  D  F  H
1  A  B  C
   D E F G H
0  1   2   3
1  4   5   6
df2(空):

   A B C         
 0 1 2 3           
 1 4 5 6    
   D E F G H
0
1
   m1 m2 m3 m4 m5
0  D  F  H
1  A  B  C
   D E F G H
0  1   2   3
1  4   5   6
dfmap:

   A B C         
 0 1 2 3           
 1 4 5 6    
   D E F G H
0
1
   m1 m2 m3 m4 m5
0  D  F  H
1  A  B  C
   D E F G H
0  1   2   3
1  4   5   6
我想写一个脚本,根据dfmap的映射填充df2。 所以输出应该是

df2:

   A B C         
 0 1 2 3           
 1 4 5 6    
   D E F G H
0
1
   m1 m2 m3 m4 m5
0  D  F  H
1  A  B  C
   D E F G H
0  1   2   3
1  4   5   6
我开始编写这段代码,但我想我错过了Dataframe的所有功能(而且它无法在充满nan的Array_df2中工作) 我知道这应该是一种最聪明/最简单的方法

listcol_df1 = {}
listcol_df2 = {}

for idx, col in enumerate(df1.columns):
    listcol_df1[col] = idx
    
for idx, col in enumerate(df2.columns):
    listcol_df2[col] = idx

Array_df1 = df1.values
Array_df2 = df2.values
Array_dfmap = dfmap.values

for i in range(df1.shape[0]):
    for j in range(dfmap.shape[1]):
        df2[i][listcol_df2.get(Array_dfmap[0][j])] = Array_df1[i][listcol_df1.get(Array_dfmap[1][j])]

谢谢

您可以使用
dfmap
重命名
df1.列
,并使用该列更新
ddf2

df2.update(df1.rename(columns=dfmap.T.set_index(1)[0]))
print(df2)
输出:

   D   E    F   G    H
0  1 NaN  2.0 NaN  3.0
1  4 NaN  5.0 NaN  6.0

这里有一个可选的循环,只需遍历
dfmap
的列,但是如果
dfmap
包含的列名不在其他DFs中,则可能需要添加异常处理:

for col in dfmap:
    df2[dfmap[col].loc[0]] = df1[dfmap[col].loc[1]]

为了解释,循环循环遍历
dfmap
中的列名,然后此语法-
dfmap[col].loc[X]
-只选择
dfmap
中的列,然后是行(
.loc[0]
选择第一行中的值,
.loc[1]
选择第二行中的值)。现在我想了想,这可能也可以写得更简单一些,如
dfmap.loc[X,col]
其中X是每种情况下的行号。

非常感谢它的工作原理,但我感到内疚,因为我不知道它为什么工作。我更新了我的答案,并提供了更多解释,希望这有帮助!不错的解决方案:)