Cómo tener grupos de barras apiladas con pitón (pandas)

Así es como se ve mi conjunto de datos:

In [1]: df1=pd.DataFrame(np.random.rand(4,2),index=["A","B","C","D"],columns=["I","J"])

In [2]: df2=pd.DataFrame(np.random.rand(4,2),index=["A","B","C","D"],columns=["I","J"])

In [3]: df1
Out[3]: 
          I         J
A  0.675616  0.177597
B  0.675693  0.598682
C  0.631376  0.598966
D  0.229858  0.378817

In [4]: df2
Out[4]: 
          I         J
A  0.939620  0.984616
B  0.314818  0.456252
C  0.630907  0.656341
D  0.020994  0.538303

Quiero tener un gráfico de barras apiladas para cada marco de datos, pero como tienen el mismo índice, me gustaría tener 2 barras apiladas por índice.

He intentado trazar ambos en los mismos ejes:

In [5]: ax = df1.plot(kind="bar", stacked=True)

In [5]: ax2 = df2.plot(kind="bar", stacked=True, ax = ax)

Pero se superpone.

Luego intenté concatenar los dos conjuntos de datos primero:

pd.concat(dict(df1 = df1, df2 = df2),axis = 1).plot(kind="bar", stacked=True)

pero aquí todo está apilado

Mi mejor intento es:

 pd.concat(dict(df1 = df1, df2 = df2),axis = 0).plot(kind="bar", stacked=True)

Lo que da :

Esto es básicamente lo que quiero, excepto que quiero que la barra se ordene como

(df1, A) (df2, A) (df1, B) (df2, B), etc.

¡Supongo que hay un truco pero no puedo encontrarlo!

Después de la respuesta de @ bgschiller obtuve esto:

Que es casi lo que quiero. Me gustaría que el bar seaagrupados por índice, para tener algo visualmente claro.

Prima : Tener la etiqueta x no es redundante, algo como:

df1 df2    df1 df2
_______    _______ ...
   A          B

Gracias por ayudar.

Respuestas a la pregunta(6)

Su respuesta a la pregunta