Как отфильтровать данные, разделив категории столбцов на наборы? - PullRequest
1 голос
/ 11 января 2020

У меня есть фрейм данных:

Prop_ID    Unit_ID      Prop_Usage                     Unit_Usage
1          1            RESIDENTIAL                    RESIDENTIAL
1          2            RESIDENTIAL                    COMMERCIAL
1          3            RESIDENTIAL                    INDUSTRIAL
1          4            RESIDENTIAL                    RESIDENTIAL
2          1            COMMERCIAL                     RESIDENTIAL
2          2            COMMERCIAL                     COMMERCIAL
2          3            COMMERCIAL                     COMMERCIAL
3          1            INDUSTRIAL                     INDUSTRIAL
3          2            INDUSTRIAL                     COMMERCIAL
4          1            RESIDENTIAL - COMMERCIAL       RESIDENTIAL
4          2            RESIDENTIAL - COMMERCIAL       COMMERCIAL
4          3            RESIDENTIAL - COMMERCIAL       INDUSTRIAL
5          1            COMMERCIAL / RESIDENTIAL       RESIDENTIAL
5          2            COMMERCIAL / RESIDENTIAL       COMMERCIAL
5          3            COMMERCIAL / RESIDENTIAL       INDUSTRIAL
5          4            COMMERCIAL / RESIDENTIAL       COMMERCIAL

В одном свойстве может быть более 1 единицы. Это означает, что единицы измерения являются подкатегорией свойств. Я хочу отфильтровать строки, где Prop_Usage не совпадает с Unit_Usage. В столбце Prop_Usage есть категория RESIDENTIAL - COMMERCIAL, тогда Unit_Usage может быть RESIDENTIAL или COMMERCIAL. Аналогично для COMMERCIAL / RESIDENTIAL.

Ожидаемый результат:

Prop_ID    Unit_ID      Prop_Usage                   Unit_Usage
1          2            RESIDENTIAL                  COMMERCIAL
1          3            RESIDENTIAL                  INDUSTRIAL
2          1            COMMERCIAL                   RESIDENTIAL
3          2            INDUSTRIAL                   COMMERCIAL
4          3            RESIDENTIAL - COMMERCIAL     INDUSTRIAL
5          3            COMMERCIAL / RESIDENTIAL     INDUSTRIAL

1 Ответ

2 голосов
/ 11 января 2020

Используйте in оператор в DataFrame.apply:

df = df[~df.apply(lambda x: x['Unit_Usage'] in x['Prop_Usage'], axis=1)]

Или используйте zip в понимании списка:

df = df[[not a in b for a, b in zip(df['Unit_Usage'], df['Prop_Usage'])]]

print (df)
    Prop_ID  Unit_ID                Prop_Usage   Unit_Usage
1         1        2               RESIDENTIAL   COMMERCIAL
2         1        3               RESIDENTIAL   INDUSTRIAL
4         2        1                COMMERCIAL  RESIDENTIAL
8         3        2                INDUSTRIAL   COMMERCIAL
11        4        3  RESIDENTIAL - COMMERCIAL   INDUSTRIAL
14        5        3  COMMERCIAL / RESIDENTIAL   INDUSTRIAL
...