将DataFrame MultiIndex与字符串列组合

时间:2018-05-23 10:07:04

标签: python pandas dataframe

我有以下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 :(得分:3)

也许一个简单的列表理解可能会有所帮助,即

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

答案 1 :(得分:2)

有这么多优雅的方法,不清楚选择哪一个。因此,这里是对其他答案中提供的方法的性能比较以及两种情况的替代方法:1)多索引由整数组成; 2)多索引由字符串组成。

Jezrael的方法(f_3)在两种情况下都获胜。然而,Dark's(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

答案 2 :(得分:2)

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]

答案 3 :(得分:1)

使用:

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

输出:

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