我有一个数据框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循环,但是没有用。 任何帮助将不胜感激!
答案 0 :(得分:3)
stack
和map
# 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
执行一次矢量化替换。
apply
和map
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]
然后根据需要将fillna
与df2
一起使用。
答案 4 :(得分:0)
df2.applymap(lambda x: df1.loc[0,x])