基于另一个DataFrame的列名对DataFrame进行子集筛选

4

我有两个数据框,我想根据与 df1 的列名相交的列名子集 df2。在 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个回答

2
如果您需要一个真正的交集,由于.columns生成了一个支持基本集合操作的Index对象,因此您可以使用&,例如:
df2[df1.columns & df2.columns]

或者等价于使用Index.intersection

df2[df1.columns.intersection(df2.columns)]

然而,如果您确信df1只是df2的列子集,您可以直接使用。
df2[df1.columns]

如果进行赋值操作,

df2.loc[:, df1.columns]

演示

>>> df2[df1.columns & df2.columns]
          a         b
0  1.952230 -0.641574
1  0.804606 -1.509773
2 -0.360106  0.939992
3  0.471858 -0.025248
4 -0.663493  2.031343

>>> df2.loc[:, df1.columns]
          a         b
0  1.952230 -0.641574
1  0.804606 -1.509773
2 -0.360106  0.939992
3  0.471858 -0.025248
4 -0.663493  2.031343

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。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接