/ / Python Pandas suelta columnas que no se encuentran en ambos marcos de datos: python, pandas, intersection

Las columnas desplegables de Python Pandas no se encuentran en ambos marcos de datos: python, pandas, intersection

Configuración de problemas:

import pandas as pd
df1 = pd.DataFrame({"D": {0: "D0", 1: "D1", 2: "D2", 3: "D3"}, "B": {0: "B0", 1: "B1", 2: "B2", 3: "B3"}, "A": {0: "A0", 1: "A1", 2: "A2", 3: "A3"}, "C": {0: "C0", 1: "C1", 2: "C2", 3: "C3"}})
df2 = pd.DataFrame({"E": {4: "B4", 5: "B5", 6: "B6", 7: "B7"}, "D": {4: "C4", 5: "C5", 6: "C6", 7: "C7"}, "F": {4: "D4", 5: "D5", 6: "D6", 7: "D7"}, "C": {4: "A4", 5: "A5", 6: "A6", 7: "A7"}})

df1

    A   B   C   D
0  A0  B0  C0  D0
1  A1  B1  C1  D1
2  A2  B2  C2  D2
3  A3  B3  C3  D3

df2

    C   D   E   F
4  A4  C4  B4  D4
5  A5  C5  B5  D5
6  A6  C6  B6  D6
7  A7  C7  B7  D7

Estoy tratando de determinar la mejor manera de devolver un marco de datos que contenga SOLAMENTE las columnas que aparecen en 2 OTROS marcos de datos.

He encontrado una solución, pero es problemática porque caerá. any columna que tiene NaN.

df3 = pd.concat([df1, df2])

A    B   C   D    E    F
0   A0   B0  C0  D0  NaN  NaN
1   A1   B1  C1  D1  NaN  NaN
2   A2   B2  C2  D2  NaN  NaN
3   A3   B3  C3  D3  NaN  NaN
4  NaN  NaN  A4  C4   B4   D4
5  NaN  NaN  A5  C5   B5   D5
6  NaN  NaN  A6  C6   B6   D6
7  NaN  NaN  A7  C7   B7   D7

df3 = df3.dropna(axis=1)

#This is the correct result I"m going for
C   D
0  C0  D0
1  C1  D1
2  C2  D2
3  C3  D3
4  A4  C4
5  A5  C5
6  A6  C6
7  A7  C7

O como una sola línea:

df3 = pd.concat([df1, df2]).dropna(axis=1)

Tengo la sensación de que hay una manera más fácil de devolver un marco de datos que contiene solo las columnas que se encuentran en los dos marcos de datos diferentes (intersección de columnas). ¿Un enfoque más elegante?

Respuestas

1 para la respuesta № 1
df3 = pd.concat([df1, df2], join="inner")

1 para la respuesta № 2

Puedes usar el intersection de las 2 columnas df:

In [177]:

cols = df1.columns.intersection(df2.columns)
cols
Out[177]:
Index(["C", "D"], dtype="object")
In [178]:

pd.concat([df1[cols],df2[cols]])
Out[178]:
C   D
0  C0  D0
1  C1  D1
2  C2  D2
3  C3  D3
4  A4  C4
5  A5  C5
6  A6  C6
7  A7  C7

0 para la respuesta № 3

Prueba esto:

common_columns = list(set(df1.columns) & set(df2.columns))
pd.concat([df1, df2])[common_columns]

Resultado:

    C   D
0  C0  D0
1  C1  D1
2  C2  D2
3  C3  D3
4  A4  C4
5  A5  C5
6  A6  C6
7  A7  C7