Умножить два кадра данных pandas на индекс

У меня есть два длинных фрейма данных:

df1 = pd.DataFrame([[1, 1],
                    [2, 1],
                    [3, 1],
                    [2, 1],
                    [2, 2],
                    [3, 2],
                    [5, 3]], columns=['value', 'id'])
df2 = pd.DataFrame([1, 2, 3, 4])

Первый столбец df1 действует как значение, а второй столбец является столбцом ID.

Я хочу умножить df1 на df2, первое значение каждого ID умножается на первое значение df2, второе значение умножается на второе и так далее. Так, например, для id=1 мы получим [1x1=1, 2x2=4, 3x3=9, 4x2=8], для id=2 мы получим [2x1=2, 3x2=6],... Гарантируется, что значения для каждого ID не превышают длину df2, и в конечном итоге результат будет чем-то вроде

1
4
9
8
2
6
5

@ScaryWombat Это первое значение с id=3, поэтому оно будет умножено на первое значение в df2, и получится 5x1=5

bachts 17.04.2024 04:22
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

код

out = df1.groupby('id').cumcount().map(df2[0]).mul(df1['value'])

вне

0    1
1    4
2    9
3    8
4    2
5    6
6    5
dtype: int64

Комментарий @wjandrea:

Перечислите каждую группу id, используйте их для индексации в df2[0], а затем умножьте.

Хороший! Однако было бы полезно добавить краткое объяснение, например: «Перечислите каждую группу id, используйте их для индексации в df2[0], а затем умножьте». Обязательно используйте это, если хотите.

wjandrea 17.04.2024 04:44

Попробуй это:

df2 = df2.rename(columns = {0: "M"})
df1['mindex'] = df1.groupby('id').cumcount().values
df1['multiplier'] = df2.M.values[df1['mindex']]
df1['product'] = df1['value'] * df1['multiplier']
df1 

Или однострочник:

# if you don't want to rename the column in df2
df1['value'] * df2[0].values[df1.groupby('id').cumcount().values]

Объяснение

Для столбца df1: вам нужен механизм для подсчета количества вхождений (со сдвигом -1, начиная с 0, 1, 2, ...) id: тогда четыре 1 будут 0, 1, 2. , 3; следующие два появления 2 в столбце id будут 0, 1, а последние 3 будут просто 0. Преимущество этих значений (сдвинутых на -1) заключается в том, что теперь они могут выступать в качестве индекса значений, которые мы получаем из df2.

Мы вычисляем эти индексы с помощью df1.groupby('id').cumcount().values, который возвращает массив [0, 1, 2, 3, 1, 2, 1]. Это хранится в столбце mindex.

Наконец, когда мы помещаем эти индексы внутрь df2.M (мы переименовали столбец 0 в M), он возвращает желаемый набор множителей.

Умножение столбцов value и multiplier дает результат в столбце product.

Результат:

ценить идентификатор миндекс множитель продукт 0 1 1 0 1 1 1 2 1 1 2 4 2 3 1 2 3 9 3 2 1 3 4 8 4 2 2 0 1 2 5 3 2 1 2 6 6 5 3 0 1 5

Вам не нужно добавлять multiplier к df... Вы просто используете его для иллюстрации?

wjandrea 17.04.2024 04:45

Зачем переименовывать df2[0]? С тем же успехом ты мог бы это сделать df2[0].values...

wjandrea 17.04.2024 04:46

Да, здесь оно использовано просто для иллюстрации. Все это можно сделать в один ряд.

CypherX 17.04.2024 04:54

@wjandrea Колонку именования желательно писать с помощью letters, а не numbers. Если бы я был ОП, я бы назвал этот столбец как-нибудь более осмысленным. Я знаю, что df2[0].values можно использовать. Я хотел показать, что именованные столбцы имеют преимущество использования нотации df2.M.

CypherX 17.04.2024 05:04

Справедливо. Я сам не использую и не рекомендую точечную нотацию, поскольку она имеет много недостатков (см. предупреждение в разделе Доступ к атрибутам).

wjandrea 17.04.2024 17:39

Другие вопросы по теме

Векторизация стоп-лосса/тейк-профита, тестирование нескольких позиций с помощью Python Pandas
Используйте DataFrame с импортированным файлом Excel
Python: объединить два кадра данных в определенных столбцах, используя Excel-эквивалент индекса/сопоставления
Не понимаю ValueError: должны иметь равные ключи и значения len при настройке с помощью итерации в Python
SQL-запросы: наиболее распространенное значение в столбце, сгруппированном по другому столбцу
Скользящая сумма `pandas` с максимальным количеством действительных наблюдений в окне
Как рассчитать индекс относительной силы (RSI) и экспоненциальную скользящую среднюю (EMA) из списка в pandas
Динамический расчет для столбцов в пандах
Как в каждом столбце фрейма данных узнать продолжительность существования каждого уникального значения в столбце?
Модель логистической регрессии со 100-процентной точностью