2016-12-20 4 views
1

Для следующих двух dataframes:Подмножество панды dataframe путем перекрытия с другим

df1 = pd.DataFrame({'name': pd.Series(["A", "B", "C"]), 'value': pd.Series([1., 2., 3.])}) 

    name value 
0 A 1.0 
1 B 2.0 
2 C 3.0 

df2 = pd.DataFrame({'name': pd.Series(["A", "C", "D"]), 'value': pd.Series([1., 3., 5.])}) 

    name value 
0 A 1.0 
1 C 3.0 
2 D 5.0 

Я хотел бы держать только те строки в df2, где значение в name столбце совпадает с значением в name колонке df1 , т.е. произвести следующую dataframe:

 name value 
0 A 1.0 
1 C 3.0 

Я попробовал несколько подходов, но я новичок в Python и панд и не ценят синтаксис приходя от R. Почему эта линия с ода не работает, и что бы?

df2[df2["name"] in df1["name"]] 

ответ

3

Вы можете использовать isin:

print (df2[df2["name"].isin(df1["name"])]) 
    name value 
0 A 1.0 
1 C 3.0 

Еще быстрее решение с numpy.intersect1d:

val = np.intersect1d(df2["name"], df1["name"]) 
print (val) 
['A' 'C'] 

print (df2[df2.name.isin(val)]) 
    name value 
0 A 1.0 
1 C 3.0 
1

Немного другой метод, который может быть полезен на ваших фактических данных, вы можете использовать «внутренний join "(пересечение) a la SQL. Более полезно, если ваши столбцы не дублируется в обоих кадрах данных (например, объединение двух различных наборов данных с некоторым общим ключом)

df1 = pd.DataFrame({'name': pd.Series(["A", "B", "C"]), 'value': pd.Series([1., 2., 3.])}) 
df2 = pd.DataFrame({'name': pd.Series(["A", "C", "D"]), 'value': pd.Series([1., 3., 5.])}) 

# supposedly for the join you should be able to tell join on='<column_name>', 'name' here, 
# but wasn't working for me. 
df1.set_index('name', inplace=True) 
df2.set_index('name', inplace=True) 

df1.join(df2, how='inner', rsuffix='_other') 

#  value value_other 
# name      
# A  1.0   1.0 
# C  3.0   3.0 

Изменение how для outer даст вам пересечение двух, left для всего df1 строк , right для df2.

Смежные вопросы