2014-10-01 2 views
0

У меня есть два кадра данных, которые содержат много столбцов в столбце, но некоторые из них не существуют в обоих. Я хотел бы создать фрейм данных, в котором есть только те столбцы, которые являются общими между обоими кадрами. Так, например:Отбрасывать столбцы, которые не являются общими между двумя файлами данных?

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) 

Но я хотел бы найти более надежное решение, в котором я не придется вручную ввести имена столбцов. Предложения?

+1

вы не можете использовать наборы и перекрестки? Например, '>>> l1 = ['Survived', 'Age', 'Title_Mr', 'Title_Mrs', 'Title_Captain'] >>> l2 = ['Survived', 'Age', 'Title_Mr', ' 'Title_Mrs', 'Title_Countess'] >>> список (набор (l1) .intersection (набор (l2))) [ 'Title_Mr', 'Возраст', 'Title_Mrs', 'Выжил'] ' – linuxfan

+0

Честное Я не уверен. Просто для уточнения - я работаю с файлами данных, а не списками, я просто печатаю столбцы из фреймов данных, чтобы показать, какие столбцы присутствуют. Это изменит что-нибудь? –

+1

@linuxfan, вам не нужно делать 'l2' набор,' set.intersection' принимает любую итерабельность, вы также можете использовать 'df1 [df1.isin (df2)]' –

ответ

2

Используя комментарии @linuxfan и @PadraicCunningham мы можем получить список общих столбцов:

common_cols = list(set(df1.columns).intersection(df2.columns)) 

Edit: ответ @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, исключение будет .

2

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

+0

+1 более простой, чем мой подход, и сохраняет порядок столбцов – bernie

+0

Спасибо. Цените upvote, потому что я, наконец, хвастаюсь, чтобы комментировать потоки! –

+0

Добро пожаловать. О, я только заметил, что есть небольшая синтаксическая ошибка. Вместо этого должно пониматься следующее: '[col для col в df1.columns, если col в df1.columns и col в df2.columns] ' – bernie

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: [] 
Смежные вопросы