У меня есть датафрейм, 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_2 на основе имен столбцов dataframe_1, например, так:

    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, но он не работал. Любая помощь с благодарностью!

3
ccsucic 8 Июл 2019 в 18:16

5 ответов

Лучший ответ

Используя replace

d2.replace(dict(zip(d1.columns,d1.iloc[0])))
3
YO and BEN_W 8 Июл 2019 в 15:22

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

Вместо того, чтобы составлять стеки для получения Series, мы применяем операцию map для каждого столбца.

3
cs95 8 Июл 2019 в 15:20

Создайте таблицу поиска и сопоставьте значения, используя базовый 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 при желании.

1
user3483203 8 Июл 2019 в 15:33

Вы можете определить словарь из df1 и использовать его для замены replace значения в 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
2
yatu 8 Июл 2019 в 15:28
df2.applymap(lambda x: df1.loc[0,x])
0
Nimitt 8 Июл 2019 в 15:29