Выбор по multiIndex - PullRequest
       0

Выбор по multiIndex

0 голосов
/ 13 мая 2018

У меня есть два кадра данных

df_a = pd.DataFrame(data=[['A', 'B', 'C'], ['A1', 'B1', 'C1']], columns=['first', 'secound', 'third'])
df_a.set_index(['first', 'secound'], inplace=True)

df_b = pd.DataFrame(data=[['A', 'B', 12], ['A', 'B', 143], ['C1', 'C1', 11]], columns=['first', 'secound', 'data'])
df_b.set_index(['first', 'secound'], inplace=True)

              third
first secound      
A     B           C
A1    B1         C1

               data
first secound      
A     B          12
      B         143
C1    C1         11

Как я могу выбрать только общие элементы индекса в df_b:

               data
first secound      
A     B          12
      B         143

Спасибо за помощь

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Вы можете взять пересечение индексов и использовать его в качестве индексатора для df_b.loc:

In [28]: df_b.loc[df_b.index.intersection(df_a.index)]
Out[28]: 
               data
first secound      
A     B          12
      B         143

или, альтернативно, использовать isin для создания логической маски для df_b.loc:

In [32]: df_b.loc[df_b.index.isin(df_a.index)]
Out[32]: 
               data
first secound      
A     B          12
      B         143

Использование isin представляется наиболее быстрым вариантом:

enter image description here

Эта настройка использовалась длясоздайте perfplot выше:

import numpy as np
import pandas as pd
import perfplot


def isin(x):
    df_a, df_b = x
    return df_b.loc[df_b.index.isin(df_a.index)]

def intersection(x):
    df_a, df_b = x
    return df_b.loc[df_b.index.intersection(df_a.index)]

def join(x):
    df_a, df_b = x
    return df_a.drop(df_a.columns, axis=1).join(df_b).dropna()

def make_df(n):
    df = pd.DataFrame(np.random.randint(10, size=(n, 3)))
    df = df.set_index([0, 1])
    return df

perfplot.show(
    setup=lambda n: [make_df(n) for i in range(2)],
    kernels=[isin, intersection, join],
    n_range=[2**k for k in range(2, 15)],
    logx=True,
    logy=True,
    equality_check=False,  # rows may appear in different order
    xlabel='len(df)')
0 голосов
/ 13 мая 2018

Вы можете присоединиться к индексу df_a с df_b, а затем сбросить NaN s:

>>> df_a.drop(df_a.columns, axis=1).join(df_b).dropna()
                data
first secound       
A     B         12.0
      B        143.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...