提问者:小点点

在Pandas中根据索引和条件将数据从列移动到行


我的示例数据如下所示:

data = {'index':  ['001', '002', '003'],
        'A' : ['red', 'green', 'blue'],
        'B' : ['blue', 'yellow', 'green'],
        'C' : ['green', 'blue', 'red'],
        'A_new' : [2, 1, 3], 'B_new' : [0, 1, 2], 'C_new' : [0, 0, 1],
        'A_old' : [1, 0, 1], 'B_old' : [1, 0, 0], 'C_old' : [0, 0, 2],
        'A_other_new' : [2, 0, 1], 'A_other_old' : [1, 1, 0]}

df = pd.DataFrame (data, columns = ['index', 'A', 'B', 'C', 'A_new', 'B_new', 'C_new', 
                                'A_old', 'B_old', 'C_old', 'A_other_new', 'A_other_old']) 
df 

输出:

    index   A       B       C       A_new  B_new  C_new  A_old  B_old  C_old  A_other_new  A_other_old
0   001     red     blue    green   2      0      0      1      1      0      2            1
1   002     green   yellow  blue    1      1      0      0      0      0      0            1
2   003     blue    green   red     3      2      1      1      0      2      1            0
    index   color   letter   other    age  
00  001     red      A       no       new   
01  001     red      A       no       new   
02  001     red      A       no       old
03  001     red      A       yes      new
04  001     red      A       yes      new
05  001     red      A       yes      old 
06  001     blue     B       no       old      
07  001     green    C       no       0 
08  002     green    A       no       new
09  002     green    A       yes      old    
10  002     yellow   B       no       new
11  002     blue     C       no       0 
12  003     blue     A       no       new
13  003     blue     A       no       new
14  003     blue     A       no       new
15  003     blue     A       no       old
16  003     blue     A       yes       new
17  003     green    B       no       new
18  003     green    B       no       new
19  003     red      C       no       new
20  003     red      C       no       old
21  003     red      C       no       old

共1个答案

匿名用户

我不确定是否理解所需输出中的other列,但您可以在这里使用melt。 如果你能解释其他什么手段会更好:

df = df.melt(id_vars=['index', 'A', 'B', 'C'],
             var_name='other')
df['age'] = df['other'].str.split('_').str[1]
df['letter'] = df['other'].str.split('_').str[0]
print(df)

   index      A       B      C        other  value    age letter
0    001    red    blue  green        A_new      2    new      A
1    002  green  yellow   blue        A_new      1    new      A
2    003   blue   green    red        A_new      3    new      A
3    001    red    blue  green        B_new      0    new      B
4    002  green  yellow   blue        B_new      1    new      B
5    003   blue   green    red        B_new      2    new      B
6    001    red    blue  green        C_new      0    new      C
7    002  green  yellow   blue        C_new      0    new      C
8    003   blue   green    red        C_new      1    new      C
9    001    red    blue  green        A_old      1    old      A
10   002  green  yellow   blue        A_old      0    old      A
11   003   blue   green    red        A_old      1    old      A
12   001    red    blue  green        B_old      1    old      B
13   002  green  yellow   blue        B_old      0    old      B
14   003   blue   green    red        B_old      0    old      B
15   001    red    blue  green        C_old      0    old      C
16   002  green  yellow   blue        C_old      0    old      C
17   003   blue   green    red        C_old      2    old      C
18   001    red    blue  green  A_other_new      2  other      A
19   002  green  yellow   blue  A_other_new      0  other      A
20   003   blue   green    red  A_other_new      1  other      A
21   001    red    blue  green  A_other_old      1  other      A
22   002  green  yellow   blue  A_other_old      1  other      A
23   003   blue   green    red  A_other_old      0  other      A