Мультииндекс вместо группового - PullRequest
0 голосов
/ 22 февраля 2020

Я углубляюсь в pandas мультииндексацию, и мне интересно, могу ли я заменить групповую итеративную обработку на мультииндексирование.

В настоящее время я использую эту функцию

необработанные данные:

                       station_name station_code breaktype
0                               ABC         ABC1         N
1                   American Heroes         HERO         L
2                   American Heroes         HERO         N
3           American Movie Classics          AMC         L
4           American Movie Classics          AMC         N
5                     Animal Planet         ANPL         L
6                     Animal Planet         ANPL         N

В настоящее время я использую эту функцию:

def createRegexPattern(df):
    df = df.copy()
    groups = df.groupby(["station_name", "station_code"])
    patterns = pd.DataFrame([], columns=["origional_index", "root_words", "pattern"])
    for key, group in groups:
        patterns = patterns.append(pd.DataFrame(
            {"origional_index": [group.index.to_list()], 
             "root_words": [key], 
             "pattern": [tuple(functools.reduce(lambda x,y: x + re.split('[\s,-]',y.strip()), key,[]))]}
        ))
    return patterns.reset_index(drop=True)

Чтобы получить это:

   origional_index                             root_words                                  pattern
0              [0]                            (ABC, ABC1)                              (ABC, ABC1)
1           [1, 2]                (American Heroes, HERO)                 (American, Heroes, HERO)
2           [3, 4]         (American Movie Classics, AMC)         (American, Movie, Classics, AMC)
3           [5, 6]                  (Animal Planet, ANPL)                   (Animal, Planet, ANPL)

можно ли использовать мультииндексирование вместо получить такой результат, как: желаемый результат мультииндексирования

                                                                                origional_index breaktype
    station_name                   station_code  pattern
0   ABC                            ABC1          (ABC, ABC1)                                    0         N
1   American Heroes                HERO          (American, Heroes, HERO)                       1         L
                                                                                                2         N
2   American Movie Classics        AMC           (American, Movie, Classics, AMC)               3         L
                                                                                                4         N
3   Animal Planet                  ANPL          (Animal, Planet, ANPL)                         5         L
                                                                                                6         N

Это жизнеспособное использование для DataFrame, или я должен остановиться, пока я впереди ...

Ответы [ 2 ]

0 голосов
/ 22 февраля 2020

Вы можете сначала создать столбец pattern заранее, а затем использовать set_index() для достижения желаемого результата:

df['pattern'] = (df['station_name'].str.split() + df['station_code'].str.split()).apply(tuple).astype(str)

df.reset_index().set_index(['station_name','station_code','pattern']).rename(columns={'index': 'original_index'})

Выход:

                                                                               original_index breaktype
station_name            station_code pattern                                                           
ABC                     ABC1         ('ABC', 'ABC1')                                        0         N
American Heroes         HERO         ('American', 'Heroes', 'HERO')                         1         L
                                     ('American', 'Heroes', 'HERO')                         2         N
American Movie Classics AMC          ('American', 'Movie', 'Classics', 'AMC')               3         L
                                     ('American', 'Movie', 'Classics', 'AMC')               4         N
Animal Planet           ANPL         ('Animal', 'Planet', 'ANPL')                           5         L
                                     ('Animal', 'Planet', 'ANPL')                           6         N
0 голосов
/ 22 февраля 2020

Вы можете получить что-то вроде этого довольно просто с помощью .set_index:

In [64]: df.reset_index().set_index(["station_name", "station_code"])
Out[64]:
                                      index breaktype
station_name            station_code
ABC                     ABC1              0         N
American Heroes         HERO              1         L
                        HERO              2         N
American Movie Classics AMC               3         L
                        AMC               4         N
Animal Planet           ANPL              5         L
                        ANPL              6         N

Вы также можете сделать что-то вроде превращения breaktype в столбцы с исходным индексом в качестве метки, а затем вычислить свои токены вне объединенного индекса:

In [65]: df.reset_index().set_index(["station_name", "station_code", "breaktype"]).unstack()['index']
Out[65]:
breaktype                               L    N
station_name            station_code
ABC                     ABC1          NaN  0.0
American Heroes         HERO          1.0  2.0
American Movie Classics AMC           3.0  4.0
Animal Planet           ANPL          5.0  6.0

Я не знаю, что любой из них на самом деле "лучше", чем ваш .groupby метод.

...