#python-3.x #pandas
#python-3.x #pandas
Вопрос:
Почему мой вопрос отличается от других с той же темой, merge / concat / join?
Я пытаюсь объединить 2 фрейма данных Pandas. Оба они проиндексированы по временным меткам, но разные даты. Я хотел бы объединить оба без повторения значений и заполнения пробелов с помощью NaN.
Некоторые фреймы имеют разную длину.
У меня есть 2 фрейма данных, как показано ниже:
c1b28dc
date
2016-02-01 291
2016-02-01 159
2016-02-02 322
2016-02-03 31
2016-02-10 8
956773a
date
2016-02-01 350
2016-02-01 27
2016-02-02 11
2016-02-02 8
2016-02-02 25
Но когда я объединил их, я получил:
c1b28dc 956773a
date
2016-02-01 291.0 350.0
2016-02-01 291.0 27.0
2016-02-01 159.0 350.0
2016-02-01 159.0 27.0
2016-02-02 322.0 11.0
2016-02-02 322.0 8.0
2016-02-02 322.0 25.0
И то, что я хочу, это:
c1b28dc 956773a
date
2016-02-01 291.0 350.0
2016-02-01 159.0 27.0
2016-02-02 322.0 11.0
2016-02-02 NaN 8.0
2016-02-02 NaN 25.0
2016-02-03 31 NaN
2016-02-10 8 NaN
Я пробую другой метод с concat, join и merge, но я не получил никаких улучшений.
df1.merge(df2, how='outer', left_index=True, right_index=True)
pd.concat([df1,df2], axis=1)
df1.join(df2)
Любая помощь?
Ответ №1:
Я назначаю новый ключ cumcount
здесь, чтобы помочь merge
df1=df1.assign(key=df1.groupby(level=0).cumcount()).reset_index()
df2=df2.assign(key=df2.groupby(level=0).cumcount()).reset_index()
df=df1.merge(df2,how='right')
# you can drop the columns by df=df.drop('key',1)
date c1b28dc key 956773a
0 2016-02-01 291.0 0 350
1 2016-02-01 159.0 1 27
2 2016-02-02 322.0 0 11
3 2016-02-02 NaN 1 8
4 2016-02-02 NaN 2 25
Обновить
df1.merge(df2,how='outer').sort_values('date').drop('key',1)
date c1b28dc 956773a
0 2016-02-01 291.0 350.0
1 2016-02-01 159.0 27.0
2 2016-02-02 322.0 11.0
5 2016-02-02 NaN 8.0
6 2016-02-02 NaN 25.0
3 2016-02-03 31.0 NaN
4 2016-02-10 8.0 NaN
Комментарии:
1. Я написал то же самое, что вы мне дали, но я получил другой результат. Пока
row[2]
все хорошо, но вместо этогоrow[3]
я получаюdate: 2016-02-03
date: 2016-02-02
снова2. @SalvadorVigo Я не уверен, что здесь происходит, я могу предоставить свои данные, может быть, вы можете попробовать?
3. Я думаю, что знаю проблему. в вашем вводе индекс представляет собой строки, а не объекты datetime. В моем случае это типы datetime
4. @SalvadorVigo даже если это дата и время, все еще работает. позвольте мне попробовать
5. @SalvadorVigo да, это дает тот же результат