объединить DataFrame MultiIndex в строковый столбец - PullRequest
0 голосов
/ 23 мая 2018

У меня есть следующий DataFrame:

df = pd.DataFrame([[1,2,3], [11,22,33]], columns = ['A', 'B', 'C'])
df.set_index(['A', 'B'], inplace=True)

        C
A  B     
1  2    3
11 22  33

Как создать дополнительный «текстовый» столбец, который будет комбинацией строк MultiIndex.

Без удаления моего индекса!

Например:

        C    D
A  B            
1  2    3    1_2
11 22  33  11_22

Ответы [ 4 ]

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

Использование:

df['new'] = df.index.map('{0[0]}_{0[1]}'.format)

Выход:

        C    new
A  B            
1  2    3    1_2
11 22  33  11_22
0 голосов
/ 23 мая 2018

Возможно, может помочь простое понимание списка, например

df['new'] = ['_'.join(map(str,i)) for i in df.index.tolist()]

        C    new
A  B            
1  2    3    1_2
11 22  33  11_22
0 голосов
/ 23 мая 2018

Раствор в python 3.6:

df['new'] = [f'{i}_{j}' for i, j in df.index]
print (df)
        C    new
A  B            
1  2    3    1_2
11 22  33  11_22

А ниже:

df['new'] = ['{}_{}'.format(i,j) for i, j in df.index]
0 голосов
/ 23 мая 2018

При таком количестве элегантных методов не ясно, какой из них выбрать.Итак, вот сравнение производительности методов, представленных в других ответах плюс альтернативный для двух случаев: 1) мультииндекс состоит из целых чисел;2) мультииндекс состоит из строк.

Метод Джезраэля (f_3) выигрывает в обоих случаях.Тем не менее, Dark (f_2) является самым медленным для второго случая.Метод 1 очень плохо работает с целыми числами из-за шага преобразования типов, но работает так же быстро, как f_3 со строками.

Случай 1:

df = pd.DataFrame({'A': randint(1, 10, num_rows), 'B': randint(10, 20, num_rows), 'C': randint(20, 30, num_rows)})
df.set_index(['A', 'B'], inplace=True)

# Method 1
def f_1(df): 
    df['D'] = df.index.get_level_values(0).astype('str') + '_' + df.index.get_level_values(1).astype('str')
    return df

## Method 2
def f_2(df):
    df['D'] = ['_'.join(map(str,i)) for i in df.index.tolist()]
    return df

## Method 3
def f_3(df): 
    df['D'] = [f'{i}_{j}' for i, j in df.index]
    return df

## Method 4
def f_4(df): 
    df['new'] = df.index.map('{0[0]}_{0[1]}'.format)
    return df

enter image description here

Дело 2:

alpha = list("abcdefghijklmnopqrstuvwxyz")
df = pd.DataFrame({'A': np.random.choice(alpha, size=num_rows), \
                     'B': np.random.choice(alpha, size=num_rows), \
                     'C': randint(20, 30, num_rows)})
df.set_index(['A', 'B'], inplace=True)

# Method 1
def f_1(df): 
    df['D'] = df.index.get_level_values(0) + '_' + df.index.get_level_values(1)
    return df

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...