Python 数据帧映射练习
我刚开始使用Python,我做了一个简单的练习。 我有3个数据帧,如下所示: df1: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
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是每种情况下的行号。非常感谢它的工作原理,但我感到内疚,因为我不知道它为什么工作。我更新了我的答案,并提供了更多解释,希望这有帮助!不错的解决方案:)