在熊猫中绘制一个度量



将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

相关内容

最新更新