Я могу воссоздать вашу проблему, если я использую строку для одного набора и int для другого. Я предполагаю, что ваши типы отличаются для столбца Strike:
tuples1 = [('AA', '2018', '05', '18', '29'), ('AA', '2018', '05', '18', '30')]
index1 = pd.MultiIndex.from_tuples(tuples1, names=('Symbol', 'YYYY', 'MM', 'DD', 'Strike'))
tuples2 = [('AA', '2018', '05', '18', 29), ('AA', '2018', '05', '18', 30)]
index2 = pd.MultiIndex.from_tuples(tuples2, names=('Symbol', 'YYYY', 'MM', 'DD', 'Strike'))
df1 = pd.DataFrame(np.random.rand(2,2), index=index1, columns=['A','B'])
df2 = pd.DataFrame(np.random.rand(2, 2), index=index2, columns=['C', 'D'])
print(df1)
print(df2)
print(df1.join(df2, how='outer'))
выход:
A B C D
Symbol YYYY MM DD Strike
AA 2018 05 18 29 0.891830 0.670130 NaN NaN
30 0.126326 0.921279 NaN NaN
29 NaN NaN 0.962292 0.822756
30 NaN NaN 0.478753 0.559231
если вы попробуете:
print(index1.get_level_values(4))
print(index2.get_level_values(4))
Тогда вы видите, что у них разные типы данных:
Index(['29', '30'], dtype='object', name='Strike')
Int64Index([29, 30], dtype='int64', name='Strike')
Если вы делаете
df1.Strike = df1.Strike.astype('object')
Тогда вы получите:
Symbol object
YYYY object
MM object
DD object
Strike float64
C float64
D float64
Вместо этого
df1.Strike = df1.Strike.astype(str)
Это дает:
Symbol object
YYYY object
MM object
DD object
Strike object
C float64
D float64
И наконец:
print(df1.join(df2, how='outer'))
Выход:
A B C D
Symbol YYYY MM DD Strike
AA 2018 05 18 29 0.755093 0.256132 0.291880 0.404898
30 0.827709 0.254511 0.849849 0.605643
Конечно, это не сработает, если вы в конечном итоге будете сравнивать строку «30» со строкой «30 .0», поэтому может быть лучше изменить строку на float, а не наоборот.