Python Pandas删除了在两个数据帧中都找不到的列

时间:2015-08-21 16:17:13

标签: python pandas intersection

问题设置

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

我正在尝试确定返回包含仅出现在2个其他数据框中的列的数据框的最佳方法。

我提出了一个解决方案,但这有问题,因为它会删除any的{​​{1}}列。

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

我感觉有一种更简单的方法可以返回一个只包含两个不同数据帧(列交集)中的列的数据帧。更优雅的方法?

3 个答案:

答案 0 :(得分:1)

您可以使用2 df列的intersection

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

试试这个:

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

结果:

    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