Заполнение фрейма данных на основе имени столбца и значения индекса другого фрейма данных - PullRequest
3 голосов
/ 08 июля 2019

У меня есть фрейм данных, 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

Я попытался использовать цикл for с использованием .loc, но он не сработал.Любая помощь с благодарностью!

Ответы [ 5 ]

3 голосов
/ 08 июля 2019

Использование replace

d2.replace(dict(zip(d1.columns,d1.iloc[0])))
3 голосов
/ 08 июля 2019

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

Stack 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 к каждому столбцу.

2 голосов
/ 08 июля 2019

Вы можете определить словарь из 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
1 голос
/ 08 июля 2019

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

0 голосов
/ 08 июля 2019
df2.applymap(lambda x: df1.loc[0,x])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...