Как я могу сопоставить два кадра данных и получить следующий результат? - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть следующий фрейм данных: payment - это строка названия платежа со значением

payment = pd.DataFrame({'Payment':["payment1","payment2","payment3"],'Value':[100,200,300]})

Payment     Value
payment1    100
payment2    200
payment3    300

, а project_cost - строка названия проекта с их стоимостью

project_cost = pd.DataFrame({'Project':["Project1","Project2","Project3"],'Cost':[200,300,400]})

Project        Cost
Project1       200
Project2       300
Project3       400

Я в основном хочу сопоставить платеж с проектом.

Как получить следующий фрейм данных?

Project     Cost      Payment 
Project1     100      payment1
Project1     100      payment2
Project2     100      payment2
Project2     200      payment3
Project3     100      payment3
Project3     300    

Последняя строка платежа оставлена ​​пустой, так как существует дефицит платежа для оплаты проекта.

Могу ли я что-нибудь сделать в pandas, чтобы получить этот результат? Большое спасибо

Ниже приводится логика c моего фрейма данных: I have added this image to help you understand my logic

Платеж разбит в соответствии с проектом.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

Следующее, кажется, работает для данных образца. Вы должны проверить это немного больше. Идея состоит в том, что вы вычисляете накопление (cumsum) затрат и платежей. Затем вы можете сортировать их все чаще и пытаться распространять Payment и Project соответственно.

project_cost['accum'] = project_cost['Cost'].cumsum()
payment['accum'] = payment['Value'].cumsum()

(payment.merge(project_cost, on='accum', how='outer')
    .sort_values('accum')
    .bfill()
)

Выход:

    Payment  Value  accum   Project   Cost
0  payment1  100.0    100  Project1  200.0
3  payment2  200.0    200  Project1  200.0
1  payment2  200.0    300  Project2  300.0
4  payment3  300.0    500  Project2  300.0
2  payment3  300.0    600  Project3  400.0
5       NaN    NaN    900  Project3  400.0
0 голосов
/ 20 февраля 2020

Я не уверен, что правильно понял вопрос, но если вы хотите объединить оба фрейма данных, вам потребуется как минимум один столбец для сопоставления, т. Е. «Значение» или «Стоимость». Поэтому, если у вас есть следующий ввод

payment = pd.DataFrame({'Payment':["payment1","payment2","payment3"],'Cost':[100,200,300]})
project_cost = pd.DataFrame({'Project':["Project1","Project2","Project3"],'Cost':[200,300,400]})

Тогда вы можете объединить два фрейма данных, используя объединение в pandas

result = pd.merge(payment, project_cost, on= 'Cost')

Дайте мне знать, правильно ли я понял проблему.

Редактировать:

    Payment Cost    Project
0   payment1    200 Project1
1   payment2    200 Project1
2   payment3    200 Project1

Это то, что вы ищете?

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