Как получить значения в одном кадре данных на основе позиции значения в другом кадре данных - PullRequest
1 голос
/ 23 марта 2019

У меня есть два кадра данных с одинаковым размером.

df1
1 5 3
6 5 1
2 4 9

df2
a b c
d e f
g h i

Я хочу получить соответствующее значение на df2, которое находится в той же позиции, что и максимальное значение каждой строки в df1.Например, строка 0 имеет максимальный элемент [0,1], поэтому я бы хотел получить [0,1] из df2 в ответ

Желаемый результат будет:

df3
b
d
i

Большое спасибо!

Ответы [ 4 ]

1 голос
/ 23 марта 2019

Ваша проблема состоит из двух частей:
1- Нахождение максимального значения каждой строки
2- Выбор максимального столбца каждой строки со значениями, найденными на первом шаге

Вы можете легко использовать функцию lookup . Первый аргумент - это поиск максимального столбца в строках (первый шаг), а второй - выбор (второй шаг)

df2.lookup(range(len(df1)), df1.idxmax()) #output => array(['b', 'd', 'i'], dtype=object)

Если массив не работает для вас, вы также можете создать фрейм данных из этих значений, просто передав его в pd.DataFrame:

pd.DataFrame(df2.lookup(range(len(df1)), df1.idxmax()))

Одна хорошая особенность этого решения - избегать петель, которые делают его эффективным.

1 голос
/ 23 марта 2019
>>> for i, j in enumerate(df1.idxmax()):
...     print(df2.iloc[i, j])
... 
b
d
i

idxmax дает идентификатор максимального значения в кадре данных, либо по строкам, либо по столбцам.

1 голос
/ 23 марта 2019

Не используйте для петель. numpy здесь может пригодиться

vals = df2.values[np.arange(len(df2)), df1.values.argmax(1)]

Конечно, можно df3 = pd.DataFrame(vals)

    col
0   b
1   d
2   i
1 голос
/ 23 марта 2019
S=df1.idxmax(axis=0)
p=0
for a in range(len(df1):

     df3.iloc(['a','0'])=df2.iloc([S[p],0])
     p+=1

Попробуйте код:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...