python - 将一个级别(具有固定值)附加到 pandas Series/DataFrame

标签 python pandas dataframe multi-index

我有一个带有多索引的 pandas 系列,如下所示:

category_1  number
A           0         1.764052
            1         0.400157
            2         0.978738
            3         2.240893
            4         1.867558
C           0        -0.977278
            1         0.950088
            2        -0.151357
            3        -0.103219
            4         0.410599

它是从这段代码生成的:

import pandas as pd
import numpy as np
idx = pd.MultiIndex.from_product([['A','C'],range(5)], names=['category_1','number'])
np.random.seed(0)
s = pd.Series(index=idx, data = np.random.randn(len(idx)))

我想添加另一个级别,称为 category_2 到具有固定值(即 D)的索引,以获得以下结果:

category_1  category_2  number
A           D           0         1.764052
                        1         0.400157
                        2         0.978738
                        3         2.240893
                        4         1.867558
C           D           0        -0.977278
                        1         0.950088
                        2        -0.151357
                        3        -0.103219
                        4         0.410599

我一直在使用这种 hacky 的方式来做到这一点:

df =s.to_frame('dummy')
df['category_2'] = 'D'
df.set_index('category_2', append = True, inplace = True)
df = df.reorder_levels([0,2,1])
res = df['dummy']

是否有更好(更简洁/pythonic)的方法来向 pandas Series/DataFrame 上的现有级别添加具有固定值的级别?

最佳答案

您需要创建新的 MultiIndex 然后替换旧的:

#change multiindex
new_index = list(zip(s.index.get_level_values('category_1'), 
                     ['D'] * len(s.index), 
                     s.index.get_level_values('number')))
print (new_index)
[('A', 'D', 0), ('A', 'D', 1),
 ('A', 'D', 2), ('A', 'D', 3), 
 ('A', 'D', 4), ('C', 'D', 0), 
 ('C', 'D', 1), ('C', 'D', 2), 
 ('C', 'D', 3), ('C', 'D', 4)]
s.index = pd.MultiIndex.from_tuples(new_index, 
                                    names=['category_1','category_2','number'])
print (s)
category_1  category_2  number
A           D           0         1.764052
                        1         0.400157
                        2         0.978738
                        3         2.240893
                        4         1.867558
C           D           0        -0.977278
                        1         0.950088
                        2        -0.151357
                        3        -0.103219
                        4         0.410599
dtype: float64

另一个很好的解决方案 MultiIndex.from_product - 有点变化 comment :

s.index = pd.MultiIndex.from_product([s.index.levels[0], 
                                      ['D'], 
                                      s.index.levels[1]], names= ['c1','c2','number']) 
print (s)
c1  c2  number
A   D   0         1.764052
        1         0.400157
        2         0.978738
        3         2.240893
        4         1.867558
C   D   0        -0.977278
        1         0.950088
        2        -0.151357
        3        -0.103219
        4         0.410599
dtype: float64

或者:

s.index = pd.MultiIndex.from_product([s.index.get_level_values('category_1').unique(), 
                                      ['D'],  
                                      s.index.get_level_values('number').unique()], 
                                     names= ['c1','c2','number']) 
print (s)
c1  c2  number
A   D   0         1.764052
        1         0.400157
        2         0.978738
        3         2.240893
        4         1.867558
C   D   0        -0.977278
        1         0.950088
        2        -0.151357
        3        -0.103219
        4         0.410599
dtype: float64

关于python - 将一个级别(具有固定值)附加到 pandas Series/DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40636163/

相关文章:

python - 使用 numpy 的高效区域加权和

python - 计算 groupby 中计数器递增的次数

python - 为 pandas DataFrame 中的每一列分配数据类型 - Python

python - 给定一列具有特定值的情况下编辑数据框的行

python - 从一个txt文件中获取数据

python - 将图像从 PIL 转换为 openCV 格式

python - 以最快的方式将 one-hot 编码的特征保存到 Pandas DataFrame 中

python - 如何对 pandas 中每一行的值进行排名

python - 使用 Pandas DataFrame 进行部分多重索引

python - 需要将数据框的列值转换为单独的列,并使用 panda 填充每个单元格的计数值