InsideDarkWeb.com

Как создать новую колонку на основании значения по номеру колонки и строки другого DataFrame?

Есть df1 содержащий номера колонок и строк:

df1 = pd.DataFrame({
      'column': [0, 1, 0, 2, 2, 1, 0, 1],
      'row': [1, 0, 2, 4, 5, 1, 3, 0]})

 column row
0   0   1
1   1   0
2   0   2
3   2   4
4   2   5
5   1   1
6   0   3
7   1   0

И df2 содержащий значения:

df2 = pd.DataFrame({
      'A': ['a0', 'a1', 'a2', 'a3', 'a4', 'a5'],
      'B': ['b0', 'b1', 'b2', 'b3', 'b4', 'b5'],
      'C': ['c0', 'c1', 'c2', 'c3', 'c4', 'c5']})

    A   B   C
0   a0  b0  c0
1   a1  b1  c1
2   a2  b2  c2
3   a3  b3  c3
4   a4  b4  c4
5   a5  b5  c5

Нужно добавить в df1 колонку Value со значением из df2 по номерам колонки и строки (column и row) из df1. Данных много, было бы очень хорошо не использовать циклы.

Вот желаемый результат:

  column  row   value
0      0    1      a1
1      1    0      b0
2      0    2      a2
3      2    4      c4
4      2    5      c5
5      1    1      b1
6      0    3      a3
7      1    0      b0 

2 Answers

Векторизированное решение с использованием метода DataFrame.lookup():

idx = df1.assign(col=df1["column"].map(dict(zip(df1["column"].unique(), df2.columns))))
df1["value"] = df2.lookup(idx["row"], idx["col"])

результат:

In [20]: df1
Out[20]:
   column  row value
0       0    1    a1
1       1    0    b0
2       0    2    a2
3       2    4    c4
4       2    5    c5
5       1    1    b1
6       0    3    a3
7       1    0    b0

Фактически нам просто надо было заменить индексы в столбце df1["column"] на реальные имена столбцов из df2,чтобы напрямую воспользоваться df.lookup():

In [24]: idx
Out[24]:
   column  row col
0       0    1   A
1       1    0   B
2       0    2   A
3       2    4   C
4       2    5   C
5       1    1   B
6       0    3   A
7       1    0   B

Correct answer by MaxU on February 13, 2021

При ваших исходных:

vals=[]
for i in df1.itertuples():
    vals.append(df2.iat[i[2], i[1]])
    
df1["values"] = vals

получаем df1:

   column  row values
0       0    1     a1
1       1    0     b0
2       0    2     a2
3       2    4     c4
4       2    5     c5
5       1    1     b1
6       0    3     a3
7       1    0     b0

Answered by strawdog on February 13, 2021

Add your own answers!

Related Questions

Ask a Question

Get help from others!

© 2021 InsideDarkWeb.com. All rights reserved.