#python #pandas
#python #pandas
Вопрос:
Я бы объединил / объединил два фрейма данных следующим образом:
ID1 = [2002070, 2002070, 2002740,2002740,2003010]
ID2 = [2002070, 200800, 200800,2002740,2002740]
Value1 = [4.5, 4.2, 3.7, 4.8, 4.4]
Value2 = [7.2, 6.4, 10, 2.3, 1.5]
date1 = ['2008-05-14', '2005-12-07','2008-10-27', '2009-04-20', '2012-03-01']
date2 = ['2005-12-07','2003-10-10', '2004-05-14', '2011-06-03', '2015-07-05']
date1=pd.to_datetime(date1)
date2=pd.to_datetime(date2)
df1=pd.DataFrame({'ID': ID1, 'Value1': Value1, 'Date1':date1}).sort_values('Date1')
df2=pd.DataFrame({'ID': ID2, 'Value2': Value2, 'Date2':date2}).sort_values('Date2')
ok = df1.merge(df2,on='ID', how='outer', sort=True)
И я получил этот новый df, где данные дублируются, когда отсутствуют в одном df
ID Value1 Date1 Value2 Date2
0 200800 NaN NaT 6.4 2003-10-10
1 200800 NaN Na 10 2004-05-14
2 2002070 4.2 2005-12-07 7.2 2005-12-07
3 2002070 4.5 2008-05-14 7.2 2005-12-07
4 2002740 3.7 2008-10-27 2.3 2011-06-03
5 2002740 3.7 2008-10-27 1.5 2015-07-05
6 2002740 4.8 2009-04-20 2.3 2011-06-03
7 2002740 4.8 2009-04-20 1.5 2015-07-05
8 2003010 4.4 2012-03-01 NaN NaT
Но я хотел бы получить это, когда только данные с одинаковым идентификатором и датой лежат в одной строке, остальные данные заменяются на NaN или NaT и не дублируются
ID Value Date1 Value2 Date2
0 200800 NaN NaT 6.4 2003-10-10
1 200800 NaN NaT 10 2004-05-14
2 2002070 4.2 2005-12-07 7.2 2005-12-07 <---on the same row
3 2002070 4.5 2008-05-14 NaN NaT <---not duplicated
4 2002740 3.7 2008-10-27 NaN NaT
5 2002740 NaN NaT 2.3 2011-06-03
6 2002740 NaN NaT 1.5 2015-07-05
7 2002740 4.8 2009-04-20 NaN NaT
8 2003010 4.4 2012-03-01 NaN NaT
Вы знаете, как это сделать?
Комментарии:
1. Почему
8,9
строка дублируется?2. Потому что Date2.iloc[8] отличается от Date2.iloc[9] . Спасибо за ответ, я искал именно этот тип кода!
3. хм, значит
5,6
, строки — это одинаковые8,9
строки? Не понимаю4. Я видел ошибку!! Я буду редактировать с правильной таблицей. Извините за ошибку
Ответ №1:
Я считаю, что вам нужны DataFrame.merge
оба столбца с левой и правой стороны:
ok = df1.merge(df2, left_on=['ID','Date1'],right_on=['ID','Date2'], how='outer', sort=True)
print (ok)
ID Value1 Date1 Value2 Date2
0 200800 NaN NaT 6.4 2003-10-10
1 200800 NaN NaT 10.0 2004-05-14
2 2002070 4.2 2005-12-07 7.2 2005-12-07
3 2002070 4.5 2008-05-14 NaN NaT
4 2002740 3.7 2008-10-27 NaN NaT
5 2002740 4.8 2009-04-20 NaN NaT
6 2002740 NaN NaT 2.3 2011-06-03
7 2002740 NaN NaT 1.5 2015-07-05
8 2003010 4.4 2012-03-01 NaN NaT