根据另一个数据框的列名和索引值填充数据框

时间:2019-07-08 15:16:33

标签: python pandas

我有一个数据框dataframe_1,看起来像这样:

    0   1   2   3   4   5  ...  192
0   12  35  60  78  23  90      32

另一个数据帧dataframe_2看起来像这样:

    58   59   60    61   62 ... 350     
0   1    4    192   4    4      1
1   0    3    3     5    3      4
2   3    1    4     2    2      192

dataframe_2中的值是dataframe_1中的列名。我想做的是根据dataframe_1的列名更改dataframe_2中的值,例如:

    58   59   60   61   62 ... 350     
0   35   23   32   23   23     35
1   12   78   78   90   78     23
2   78   35   23   60   60     32

我尝试使用.loc进行for循环,但是没有用。 任何帮助将不胜感激!

5 个答案:

答案 0 :(得分:3)

stackmap

# if necessary, cast,
# df1.columns = df1.columns.astype(int)

df2.stack().map(df1.iloc[0]).unstack()

   58  59  60  61  62  350
0  35  23  32  23  23   35
1  12  78  78  90  78   23
2  78  35  23  60  60   32

堆栈df2,因此我们可以调用Series.map来使用df1执行一次矢量化替换。


applymap

df2.apply(pd.Series.map, args=(df1.iloc[0],))

   58  59  60  61  62  350
0  35  23  32  23  23   35
1  12  78  78  90  78   23
2  78  35  23  60  60   32

我们不用堆叠来获得系列,而是对每列应用map操作。

答案 1 :(得分:3)

使用replace

d2.replace(dict(zip(d1.columns,d1.iloc[0])))

答案 2 :(得分:2)

您可以从df1定义一个字典,并用它来替换{​​{3}} df2中的值:

d = dict(zip(df1.columns, df1.values.ravel()))
df2.replace(d)

   58  59  60  61  62  350
0  35  23  32  23  23   35
1  12  78  78  90  78   23
2  78  35  23  60  60   32

或者堆叠df1然后替换:

df2.replace(df1.stack().droplevel(0))

   58  59  60  61  62  350
0  35  23  32  23  23   35
1  12  78  78  90  78   23
2  78  35  23  60  60   32

答案 3 :(得分:1)

创建一个查找表并使用基础的numpy array映射值。假定列名称为整数。

u = np.zeros(df1.columns.max()+1, dtype=int)
u[df1.columns] = df1.iloc[0].values

u[df2.values]

array([[35, 23, 32, 23, 23, 35],
       [12, 78, 78, 90, 78, 23],
       [78, 35, 23, 60, 60, 32]])

如果某些值可能与df1中的值不匹配:

u = np.full(df1.columns.max()+1, np.nan)
u[df1.columns] = df1.iloc[0].values

u[df2.values]

然后根据需要将fillnadf2一起使用。

答案 4 :(得分:0)

df2.applymap(lambda x: df1.loc[0,x])