При таком количестве элегантных методов не ясно, какой из них выбрать.Итак, вот сравнение производительности методов, представленных в других ответах плюс альтернативный для двух случаев: 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](https://i.stack.imgur.com/hL6bB.png)
Дело 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](https://i.stack.imgur.com/5AETV.png)