Python 从多个ID列创建新的DataFrame行

Python 从多个ID列创建新的DataFrame行,python,pandas,Python,Pandas,我有一个数据框架,其中行具有属性,并且可能有多个ID。例如: Name Weapon Color ID1 ID2 ID3 Leo Sword Blue 11 12 Raph Sai Red 13 Don Bo Purple 14 15 16 Mike Nunchuck Orange 17 Name Weapon Color ID Leo

我有一个数据框架,其中行具有属性,并且可能有多个ID。例如:

Name    Weapon    Color   ID1    ID2    ID3
Leo     Sword     Blue    11     12
Raph    Sai       Red     13
Don     Bo        Purple  14     15     16
Mike    Nunchuck  Orange  17
Name    Weapon    Color   ID
Leo     Sword     Blue    11
Leo     Sword     Blue    12
Raph    Sai       Red     13
Don     Bo        Purple  14
Don     Bo        Purple  15
Don     Bo        Purple  16
Mike    Nunchuck  Orange  17
我想让这些ID中的每一个都有自己的行,同时保留行的属性。例如:

Name    Weapon    Color   ID1    ID2    ID3
Leo     Sword     Blue    11     12
Raph    Sai       Red     13
Don     Bo        Purple  14     15     16
Mike    Nunchuck  Orange  17
Name    Weapon    Color   ID
Leo     Sword     Blue    11
Leo     Sword     Blue    12
Raph    Sai       Red     13
Don     Bo        Purple  14
Don     Bo        Purple  15
Don     Bo        Purple  16
Mike    Nunchuck  Orange  17
如何使用选定的特定列创建行,以及从哪些列保留数据?

您可以使用:

df.melt(['Name','Weapon','Color'],value_name='ID').drop('variable',1).dropna()
您可以使用:

df.melt(['Name','Weapon','Color'],value_name='ID').drop('variable',1).dropna()
您还可以使用stack,它保持数据的原始顺序:

(df.set_index(['Name', 'Weapon', 'Color'])
   .stack().reset_index(level=-1, drop=True)
   .reset_index(name='ID'))
输出:

    Name    Weapon      Color   ID
0   Leo     Sword       Blue    11.0
1   Leo     Sword       Blue    12.0
2   Raph    Sai         Red     13.0
3   Don     Bo          Purple  14.0
4   Don     Bo          Purple  15.0
5   Don     Bo          Purple  16.0
6   Mike    Nunchuck    Orange  17.0
请注意,这将忽略原始数据帧的索引。

您也可以使用堆栈,它保持数据的原始顺序:

(df.set_index(['Name', 'Weapon', 'Color'])
   .stack().reset_index(level=-1, drop=True)
   .reset_index(name='ID'))
输出:

    Name    Weapon      Color   ID
0   Leo     Sword       Blue    11.0
1   Leo     Sword       Blue    12.0
2   Raph    Sai         Red     13.0
3   Don     Bo          Purple  14.0
4   Don     Bo          Purple  15.0
5   Don     Bo          Purple  16.0
6   Mike    Nunchuck    Orange  17.0
请注意,这将忽略原始数据帧的索引。

df.melt['Name'、'wear'、'Color'],value_Name='ID'。如果需要按ID排序,则删除'variable',1.dropna.sort_值'ID'节省的方法是按['Name'、'wearm'、'Color']排序,因为这些列是熔化的,但很好的答案是upvoteddf.melt['Name'、'wearm'、'Color'],value_Name='ID'。如果需要按ID排序,则删除'variable',1.dropna.sort_值'ID'节省的方法是按[‘名称’、‘武器’、‘颜色’]进行排序,因为这些列是熔化的,但很好的答案是向上投票