根据另一个DataFrame的列名对子DataSet进行子集

时间:2017-04-10 19:20:16

标签: python pandas dataframe

我有两个DataFrame,我希望根据与df2列名称相交的列名来对df1进行分组。在R这很容易。

R代码:

df1 <- data.frame(a=rnorm(5), b=rnorm(5))
df2 <- data.frame(a=rnorm(5), b=rnorm(5), c=rnorm(5))

df2[names(df2) %in% names(df1)]
           a          b
1 -0.8173361  0.6450052
2 -0.8046676  0.6441492
3 -0.3545996 -1.6545289
4  1.3364769 -0.4340254
5 -0.6013046  1.6118360

但是,我不确定如何在pandas中执行此操作。

pandas尝试:

df1 = pd.DataFrame({'a': np.random.standard_normal((5,)), 'b': np.random.standard_normal((5,))})
df2 = pd.DataFrame({'a': np.random.standard_normal((5,)), 'b': np.random.standard_normal((5,)), 'c': np.random.standard_normal((5,))})

df2[df2.columns in df1.columns]

这导致TypeError: unhashable type: 'Index'。什么是正确的方法?

2 个答案:

答案 0 :(得分:1)

如果你需要一个真正的交集,由于ggplot产生一个支持基本集合操作的Index对象,你可以使用.columns,例如

&

或等同于Index.intersection

df2[df1.columns & df2.columns]

但是,如果您保证df2[df1.columns.intersection(df2.columns)] 只是df1的列子集,则可以直接使用

df2

或者如果分配,

df2[df1.columns]

<强>演示

df2.loc[:, df1.columns]

答案 1 :(得分:1)

等价物是:

df2[df1.columns.intersection(df2.columns)]
Out: 
          a         b
0 -0.019703  0.379820
1  0.040658  0.243309
2  1.103032  0.066454
3 -0.921378  1.016017
4  0.188666 -0.626612

使用此功能,如果df1中的df2中的列不存在,则不会出现KeyError。