Stack Overflow на русском Asked on February 13, 2021
Есть 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
Векторизированное решение с использованием метода 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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP