#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. Спасибо, это именно то, что мне нужно!