Python 是否删除两个数据帧之间不常见的列?

Python 是否删除两个数据帧之间不常见的列?,python,pandas,dataframe,Python,Pandas,Dataframe,我有两个数据帧,它们在列中有许多列,但在两个数据帧中都不存在一些列。我想创建一个数据帧,它只包含两个数据帧之间共有的列。例如: list(df1) ['Survived', 'Age', 'Title_Mr', 'Title_Mrs', 'Title_Captain'] list(df2) ['Survived', 'Age', 'Title_Mr', 'Title_Mrs', 'Title_Countess'] 我想去: ['Survived', 'Age', 'Title_Mr', 'Ti

我有两个数据帧,它们在列中有许多列,但在两个数据帧中都不存在一些列。我想创建一个数据帧,它只包含两个数据帧之间共有的列。例如:

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)

但是我想找到一个更健壮的解决方案,不必手动输入列名。建议?

使用@linuxfan和@padraiccningham的评论,我们可以得到一个常见列的列表:

common_cols = list(set(df1.columns).intersection(df2.columns))
编辑:AdHunges的回答让我考虑保留列顺序。如果这很重要,您可以这样做:

common_cols = [col for col in set(df1.columns).intersection(df2.columns)]
要获取仅包含这些列的另一个数据帧,请使用该列表仅从df1中选择这些列:

根据:

您可以将列列表传递给[]以按该顺序选择列。 如果数据帧中不包含列,则会出现异常 提高


使用@linuxfan和@padraiccnningham的注释,我们可以得到一个常见列的列表:

common_cols = list(set(df1.columns).intersection(df2.columns))
编辑:AdHunges的回答让我考虑保留列顺序。如果这很重要,您可以这样做:

common_cols = [col for col in set(df1.columns).intersection(df2.columns)]
要获取仅包含这些列的另一个数据帧,请使用该列表仅从df1中选择这些列:

根据:

您可以将列列表传递给[]以按该顺序选择列。 如果数据帧中不包含列,则会出现异常 提高


df1=df1.drop[cols for col in df1.columns if col in df1.columns and col in df2.columns],axis=1

df1=df1.columns if col in df1.columns and col in df2.columns],axis=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: []

您不必删除列,只需选择感兴趣的列:

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: []

你不能使用集合和交点吗?例如,l1=[‘幸存’、‘年龄’、‘头衔先生’、‘头衔太太’、‘头衔船长’]>>l2=[‘幸存’、‘年龄’、‘头衔先生’、‘头衔太太’、‘头衔伯爵夫人’]>>>listsetl1.intersectionsetl2[‘头衔先生’、‘年龄’、‘头衔太太’、‘幸存’]老实说,我不确定。我只是想澄清一下——我使用的是数据帧而不是列表,我只是打印数据帧中的列,以显示存在哪些列。这会改变什么吗?@linuxfan,你不需要将l2设置为集合,集合。交叉点需要任何可编辑的,你也可以使用df1[df1.isindf2]@Padraickenningham谢谢你的教训:你不能使用集合和交叉点吗?例如,l1=[‘幸存’、‘年龄’、‘头衔先生’、‘头衔太太’、‘头衔船长’]>>l2=[‘幸存’、‘年龄’、‘头衔先生’、‘头衔太太’、‘头衔伯爵夫人’]>>>listsetl1.intersectionsetl2[‘头衔先生’、‘年龄’、‘头衔太太’、‘幸存’]老实说,我不确定。我只是想澄清一下——我使用的是数据帧而不是列表,我只是打印数据帧中的列,以显示存在哪些列。这会改变什么吗?@linuxfan,你不需要将l2设置为集合,集合。交叉点需要任何可编辑的,你也可以使用df1[df1.isindf2]@Padraickenningham谢谢你的教训:+1比我的方法更简单,并保留列顺序谢谢。感谢您的支持,因为我终于有足够的代表评论线程了!不客气。哦,我刚刚注意到有一个小的语法错误。列表理解应该是:[col for col in df1.columns if col in df1.columns and col in df2.columns]即使使用bernie的更新,我也无法使用此方法。+1比我的方法更简单,并保留列顺序谢谢。感谢您的支持,因为我终于有足够的代表评论线程了!不客气。哦,我刚刚注意到有一个小的语法错误。列表理解应该是:[col for col in df1.columns if col in df1.columns and col in df2.columns]即使使用bernie的更新,我也无法使用此方法。