Подстановка фрейма данных на основе имен столбцов другого фрейма данных


У меня есть два фрейма данных, и я хочу подмножество 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   2   2017-04-10 22:20:16

2 ответа:

Если вам нужно истинное пересечение, так как .columns дает индексный объект, который поддерживает основные операции набора, вы можете использовать &, например

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

Эквивалентом будет:

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

При этом вы не получите KeyError, если столбец в df1 не существует в df2.