Python копирует данные из 1 df в первую соответствующую строку в другом df

#python #python-3.x #pandas

#python #python-3.x #панды

Вопрос:

В принципе, я получил df1, который выглядит следующим образом:

   Ticker      Date
0   AAPL  20200501
1   AAPL  20200501
2   AAPL  20200502
3   AAPL  20200502
4   TSLA  20200501
5   TSLA  20200501
6   TSLA  20200502
7   TSLA  20200502
  

и df2, который выглядит следующим образом:

   Ticker      Date  Comm.
0   AAPL  20200501    500
1   AAPL  20200502    800
2   TSLA  20200501   1000
3   TSLA  20200502   1500
  

как мне заставить df1 выглядеть так?

   Ticker      Date  Comm.
0   AAPL  20200501    500
1   AAPL  20200501      0
2   AAPL  20200502    800
3   AAPL  20200502      0
4   TSLA  20200501   1000
5   TSLA  20200501      0
6   TSLA  20200502   1500
7   TSLA  20200502      0
  

пример кода:

 import pandas as pd

df1 = pd.DataFrame({'Ticker': ['AAPL', 'AAPL', 'AAPL', 'AAPL','TSLA', 'TSLA', 'TSLA', 'TSLA'],
                'Date': [20200501, 20200501, 20200502, 20200502, 20200501, 20200501, 20200502, 20200502]})
print(df1)

df2 = pd.DataFrame({'Ticker': ['AAPL', 'AAPL', 'TSLA', 'TSLA'],
               'Date': [20200501, 20200502, 20200501, 20200502],
                'Comm.': [500, 800, 1000, 1500]})
print(df2)

output = pd.DataFrame({'Ticker': ['AAPL', 'AAPL', 'AAPL', 'AAPL','TSLA', 'TSLA', 'TSLA', 'TSLA'],
                'Date': [20200501, 20200501, 20200502, 20200502, 20200501, 20200501, 20200502, 20200502],
                   'Comm.': [500, 0, 800, 0, 1000, 0, 1500, 0]})
print(output)
  

PS: стек не позволит мне опубликовать этот вопрос, потому что в моем вопросе много кода и недостаточно текста, поэтому я набираю этот текст-заполнитель здесь, но я предполагаю, что вы понимаете, что я имею в виду

Ответ №1:

Вы можете использовать merge для сопоставления Comm. столбца, а затем mask для размещения 0 дублированных значений:

 df1['Comm.'] = (df1.merge(df2, on=['Ticker','Date'], how='left')
                   ['Comm.']
                   .mask(df1.duplicated(['Ticker','Date']), 0)
               )
  

Вывод:

   Ticker      Date  Comm.
0   AAPL  20200501    500
1   AAPL  20200501      0
2   AAPL  20200502    800
3   AAPL  20200502      0
4   TSLA  20200501   1000
5   TSLA  20200501      0
6   TSLA  20200502   1500
7   TSLA  20200502      0
  

Комментарии:

1. Спасибо, это именно то, что мне нужно!