将df作为
index x_1 x_2 x_3 x_4 x_5
0 50 60 70 30 20
1 10 20 30 40 50
2 10 20 20 20 20
我有一个映射,它将每一行映射到df中相应的列。
映射df是
index x_1 x_2 x_3 x_4 x_5
0 1 3 4 1 2
1 2 2 2 3 5
2 4 1 1 5 2
我想创建一个映射的df
所需输出
index x_1 x_2 x_3 x_4 x_5
0 50 70 30 50 60
1 20 20 20 30 50
2 20 10 20 20 20
游戏后期,但使用numpy的替代方案?
import pandas as pd
import numpy as np
df = pd.DataFrame([[50, 60, 70, 30, 20],
[10, 20, 30, 40, 50],
[10, 20, 20, 20, 20]])
map_df = pd.DataFrame([[1, 3, 4, 1, 2],
[2, 2, 2, 3, 5],
[4, 1, 1, 5, 2]])
np.take_along_axis(np.array(df),np.array(map_df)-1,1)
array([[50, 70, 30, 50, 60],
[20, 20, 20, 30, 50],
[20, 10, 10, 20, 20]])
您可以使用第二个数据帧行作为第一个数据帧列的索引。
import pandas as pd
df = pd.DataFrame([[50, 60, 70, 30, 20],
[10, 20, 30, 40, 50],
[10, 20, 20, 20, 20]])
map_df = pd.DataFrame([[1, 3, 4, 1, 2],
[2, 2, 2, 3, 5],
[4, 1, 1, 5, 2]])
for i in range(df.shape[0]):
df.iloc[i] = df.iloc[i][map_df.iloc[i] - 1]
print(df)
结果:
0 1 2 3 4
0 50 70 30 50 60
1 20 20 20 30 50
2 20 10 10 20 20
编辑:
无循环解决方案:
df.join(map, rsuffix='map').apply(lambda row: pd.Series(np.array(row[:5])[row[5:] - 1]).transpose(), axis=1)
让我们做一些transpose + replace
破解
mapping_df.astype(str).radd('x_').T.replace(df.T).T
x_1 x_2 x_3 x_4 x_5
index
0 50 70 30 50 60
1 20 20 20 30 50
2 20 10 10 20 20