我有两个数据框,列中有很多列,但两个中都不存在。我想创建一个只有两个数据帧之间共有的列的数据帧。例如:
list(df1)
['Survived', 'Age', 'Title_Mr', 'Title_Mrs', 'Title_Captain']
list(df2)
['Survived', 'Age', 'Title_Mr', 'Title_Mrs', 'Title_Countess']
我想去:
['Survived', 'Age', 'Title_Mr', 'Title_Mrs']
Title_Mr
和Title_Mrs
同时属于df1
和df2
。我已经想出了如何通过手动输入列名这样做:
df1 = df1.drop(['Title_Captain'], axis=1)
但我想找到一个更强大的解决方案,我不必手动输入列名。建议?
答案 0 :(得分:2)
使用@linuxfan和@PadraicCunningham的评论我们可以得到一个常见列的列表:
common_cols = list(set(df1.columns).intersection(df2.columns))
编辑:@ AdamHughes'回答让我考虑保留列顺序。如果这很重要,你可以这样做:
common_cols = [col for col in set(df1.columns).intersection(df2.columns)]
要使用该列表仅使用这些列获取另一个DataFrame,只选择df1
中的列:
df3 = df1[common_cols]
根据http://pandas.pydata.org/pandas-docs/stable/indexing.html:
您可以将列表列表传递到
[]
,以按顺序选择列。 如果DataFrame中不包含列,则会出现异常 提高。
答案 1 :(得分:2)
df1 = df1.drop([col for col in df1.columns if col in df1.columns and col in df2.columns], axis=1)
答案 2 :(得分:1)
您不一定需要删除列,只需选择感兴趣的列:
In [204]:
df1 = pd.DataFrame(columns=['Survived', 'Age', 'Title_Mr', 'Title_Mrs', 'Title_Captain'])
df2 = pd.DataFrame(columns=['Survived', 'Age', 'Title_Mr', 'Title_Mrs', 'Title_Countess'])
# create a list of the common columns using set and intersection
common_cols=list(set.intersection(set(df1), set(df2)))
# use this list to perform column selection
df1[common_cols]
['Title_Mr', 'Age', 'Survived', 'Title_Mrs']
Out[204]:
Empty DataFrame
Columns: [Title_Mr, Age, Survived, Title_Mrs]
Index: []