Python 使用后缀列表复制行并重命名数据帧索引
我有一个数据帧对象Python 使用后缀列表复制行并重命名数据帧索引,python,pandas,dataframe,numpy,indexing,Python,Pandas,Dataframe,Numpy,Indexing,我有一个数据帧对象df,如下所示: p0p1p2p3p4p5p6p7p8p9p10p11p12p13 对象 南南1.01.01.01.01.01.01.01.01.01.01.01.01.01.0 B南南1.01.01.01.01.01.01.01.01.01.01.01.0 南南1.01.01.01.01.01.01.01.01.01.01.0 D南南1.0 1.0 1.0 1.0 1.0 1.0 1.0 鄂南1.01.01.01.0 F南南1.0 1.0 1.0 G南南1.0 1.0 我想
df
,如下所示:
p0p1p2p3p4p5p6p7p8p9p10p11p12p13
对象
南南1.01.01.01.01.01.01.01.01.01.01.01.01.01.0
B南南1.01.01.01.01.01.01.01.01.01.01.01.0
南南1.01.01.01.01.01.01.01.01.01.01.0
D南南1.0 1.0 1.0 1.0 1.0 1.0 1.0
鄂南1.01.01.01.0
F南南1.0 1.0 1.0
G南南1.0 1.0
我想使用后缀列表复制每个后缀:
p0p1p2p3p4p5p6p7p8p9p10p11p12p13
对象
南南1.01.01.01.01.01.01.01.01.01.01.01.01.01.01.0
南南1.01.01.01.01.01.01.01.01.01.01.01.01.01.01.0
阿南1.01.01.01.01.01.01.01.01.01.01.01.01.01.01.0
阿努南1.01.01.01.01.01.01.01.01.01.01.01.01.01.01.0
A_XL南南1.01.01.01.01.01.01.01.01.01.01.01.01.0
南南1.01.01.01.01.01.01.01.01.01.01.01.01.01.0
B_XS南南1.01.01.01.01.01.01.01.01.01.01.0
美国南部1.01.01.01.01.01.01.01.01.01.01.01.01.0
伯明南1.01.01.01.01.01.01.01.01.01.01.01.01.0
布尔南1.01.01.01.01.01.01.01.01.01.01.01.01.0
B_XL南南1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
B南南1.01.01.01.01.01.01.01.01.01.01.01.0
南南1.01.01.01.01.01.01.01.01.0
南南大学1.01.01.01.01.01.01.01.01.0
昆南1.01.01.01.01.01.01.01.01.01.0
库南1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
C_XL南南1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
南南1.01.01.01.01.01.01.01.01.01.01.0
D_XS楠楠1.0 1.0 1.0 1.0 1.0 1.0
杜南南1.0 1.0 1.0 1.0 1.0 1.0 1.0
杜姆南1.01.01.01.01.01.0
杜南南1.0 1.0 1.0 1.0 1.0 1.0 1.0
D_XL南南1.0 1.0 1.0 1.0 1.0 1.0 1.0
D南南1.0 1.0 1.0 1.0 1.0 1.0 1.0
鄂南1.01.01.01.0
F南南1.0 1.0 1.0
G南南1.0 1.0
后缀列表是:list\u of_后缀=['XS','S','M','L','XL','']
,必须更改的索引列表是:list\u init=['A','B','C','D']
请注意,
E
、F
和G
与原始数据帧保持不变
根据这个答案:我能够根据后缀列表的长度,将初始数据帧df
中所需的行复制到正确的数字:
list_init=['A','B','C','D']
后缀列表=['XS','S','M','L','XL','']
reps=[len(后缀列表),如果列表中的k在df.index中的k在init中为1]
df=df.loc[np.重复(df.index.values,reps)]
但是现在我所有的数据帧索引都是一个由10个A
、B
、C
和D
组成的数组(除了E
、F
和G
,其中只有一行),我希望它们遵循列表中的后缀模式,如上图所示
我怎样才能以出色的表现优雅地做到这一点
(注意:如果从包含索引的列开始工作要好得多,那也没关系,因为索引列中我的对象a
,B
,C
,D
,E
,F
和G
以前来自一个名为objects
的独立列).您应该首先计算一个包含每行新索引的列表,然后分解该列表:
newvals = [['{}{}'.format(i,j) for j in ('_' + k if k != '' else k
for k in list_of_suffixes)]
if i in list_init else [i] for i in df.index]
df.reset_index().assign(object=newvals).explode('object').set_index('object')
如预期所示:
P0 P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 P11 P12 P13
object
A_XS NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
A_S NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
A_M NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
A_L NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
A_XL NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
A NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
B_XS NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0
B_S NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0
B_M NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0
B_L NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0
B_XL NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0
B NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0
C_XS NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0
C_S NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0
C_M NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0
C_L NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0
C_XL NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0
C NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0
D_XS NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0
D_S NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0
D_M NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0
D_L NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0
D_XL NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0
D NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0
E NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0
F NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0
G NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0
您应该首先计算包含每行新索引的列表,然后分解该列表:
newvals = [['{}{}'.format(i,j) for j in ('_' + k if k != '' else k
for k in list_of_suffixes)]
if i in list_init else [i] for i in df.index]
df.reset_index().assign(object=newvals).explode('object').set_index('object')
如预期所示:
P0 P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 P11 P12 P13
object
A_XS NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
A_S NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
A_M NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
A_L NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
A_XL NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
A NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
B_XS NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0
B_S NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0
B_M NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0
B_L NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0
B_XL NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0
B NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0
C_XS NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0
C_S NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0
C_M NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0
C_L NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0
C_XL NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0
C NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0
D_XS NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0
D_S NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0
D_M NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0
D_L NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0
D_XL NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0
D NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0
E NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0
F NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0
G NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0