Как отфильтровать фрейм данных по индексу И значению столбца - PullRequest
1 голос
/ 12 июня 2019

У меня есть 2 кадра данных, как это:

df1

             sales    day    ...
    index    
    1001     567      321
    1002     600      1530
    1005     789      998
    1008     825      775
    1002     300      1120

df2

             sales    day    ...
    index    
    1001     567      321
    1002     600      1530
    1005     789      998
    1014     620      1000
    1008     825      775
    1009     589      1100
    1002     300      1120
    1005     770      400
    1008     820      1600        

, и я хочу сохранить только строки в df2 в качестве индекса и днязначения точно такие же, как df1

, поэтому результат должен быть:

df2

             sales    day    ...
    index    
    1001     567      321
    1002     600      1530
    1005     789      998
    1008     825      775
    1002     300      1120

Я не могу использовать функцию isin, как показано ниже, потому что в df2 есть строки, которые имеюттот же индекс, но другое значение дня.Это уникальное сочетание индекса и дня.

    df2 = df2[df2.index.isin(df1.index)]

По сути, я хочу сделать в SQL

    select *
    from   table1 t1,
           table2 t2,
    where  t1.id = t2.id
    and    t1.day = t2.day; 

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Одна вещь, которую вы можете сделать, это установить двойной индекс на обоих фреймах данных и использовать локальный доступ:

df1 = df1.reset_index().set_index(['index','day'])
df2 = df2.reset_index().set_index(['index','day'])

print(df2.loc[df1.index])

Вывод (вы можете сделать reset_index(level=1), если вам не нужен двойной индекс)

            sales
index day        
1001  321     567
1002  1530    600
1005  998     789
1008  775     825
1002  1120    300
1 голос
/ 12 июня 2019

Идея заключается в создании MultiIndex с помощью DataFrame.set_index с параметром append, поэтому возможна фильтрация по Index.isin:

df = df2[df2.set_index('day', append=True).index.isin(df1.set_index('day', append=True).index)]
print (df)
       sales   day
index             
1001     567   321
1002     600  1530
1005     789   998
1008     825   775
1002     300  1120

Альтернатива сmerge:

df = (df1.reset_index()
         .merge(df2.reset_index(), on=['day','index'], suffixes=('_',''))
         .set_index('index')[df2.columns])
print (df)
       sales   day
index             
1001     567   321
1002     600  1530
1005     789   998
1008     825   775
1002     300  1120
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...