转换pandas数据框,其中列条目为列标题

时间:2019-03-01 12:17:00

标签: python pandas dataframe

我的数据集有12列X1-X6和Y1-Y6。变量X和Y相互匹配-第一个记录表示:A的80份,C的10份,J的2份和K的8份(每行共有100个)。

我希望能够将我的数据集转换为一个数据集,其中X1-X6列中的条目现在是标题。请参见下面的数据集前后。

我的数据集(之前):

   X1 X2 X3   X4   X5   X6    Y1    Y2    Y3    Y4    Y5   Y6
0   A  C  J    K  NaN  NaN  80.0  10.0   2.0   8.0   NaN  NaN
1   F  N  O  NaN  NaN  NaN   2.0  25.0  73.0   NaN   NaN  NaN
2   A  H  J    M  NaN  NaN  70.0   6.0  15.0   9.0   NaN  NaN
3   B  I  K    P  NaN  NaN   0.5   1.5   2.0  96.0   NaN  NaN
4   A  B  F    H    O    P  83.0   4.0   9.0   2.0   1.0  1.0
5   A  B  F    G  NaN  NaN   1.0  16.0   9.0  74.0   NaN  NaN
6   A  B  D    F    L  NaN  95.0   2.0   1.0   1.0   1.0  NaN
7   B  F  H    P  NaN  NaN   0.2   0.4   0.4  99.0   NaN  NaN
8   A  D  F    L  NaN  NaN  35.0  12.0  30.0  23.0   NaN  NaN
9   A  B  F    I    O  NaN  95.0   0.3   0.1   1.6   3.0  NaN
10  B  E  G  NaN  NaN  NaN  10.0  31.0  59.0   NaN   NaN  NaN
11  A  F  G    L  NaN  NaN  24.0   6.0  67.0   3.0   NaN  NaN
12  A  C  I  NaN  NaN  NaN  65.0  30.0   5.0   NaN   NaN  NaN
13  A  F  G    L  NaN  NaN  55.0   6.0   4.0  35.0   NaN  NaN
14  A  F  J    K    L  NaN  22.0   3.0  12.0   0.8  62.2  NaN
15  B  F  I    P  NaN  NaN   0.6   1.2   0.2  98.0   NaN  NaN
16  A  B  F    H    O  NaN  27.0   6.0  46.0  13.0   8.0  NaN

我想转换为的数据集:

   A     B     C     D     E     F     G     H    I     J    K     L    M  \
0 80.0  NaN  10.0   NaN   NaN   NaN   NaN   NaN  NaN   2.0  8.0   NaN  NaN   
1 NaN   NaN   NaN   NaN   NaN   2.0   NaN   NaN  NaN   NaN  NaN   NaN  NaN   
2 70.0  NaN   NaN   NaN   NaN   NaN   NaN   6.0  NaN  15.0  NaN   NaN  9.0   
3 NaN   0.5   NaN   NaN   NaN   NaN   NaN   NaN  1.5   NaN  2.0   NaN  NaN   
4 83.0  4.0   NaN   NaN   NaN   9.0   NaN   2.0  NaN   NaN  NaN   NaN  NaN   
5 1.0   16.0   NaN   NaN   NaN   9.0  74.0   NaN  NaN   NaN  NaN   NaN  NaN   
6 95.0   2.0   NaN   1.0   NaN   1.0   NaN   NaN  NaN   NaN  NaN   1.0  NaN   
7 NaN   0.2   NaN   NaN   NaN   0.4   NaN   0.4  NaN   NaN  NaN   NaN  NaN   
8 35.0   NaN   NaN  12.0   NaN  30.0   NaN   NaN  NaN   NaN  NaN  23.0  NaN   
9 95.0   0.3   NaN   NaN   NaN   0.1   NaN   NaN  1.6   NaN  NaN   NaN  NaN   
10 NaN  10.0   NaN   NaN  31.0  NaN   59.0   NaN  NaN   NaN  NaN   NaN  NaN   
11 24.0  NaN   NaN   NaN   NaN   6.0  67.0   NaN  NaN   NaN  NaN   3.0  NaN   
12 65.0  NaN  30.0   NaN   NaN   NaN   NaN   NaN  5.0   NaN  NaN   NaN  NaN   
13 55.0  NaN   NaN   NaN   NaN   6.0   4.0   NaN  NaN   NaN  NaN  35.0  NaN   
14 22.0  NaN   NaN   NaN   NaN   3.0   NaN   NaN  NaN  12.0  0.8  62.2  NaN   
15 NaN   0.6   NaN   NaN   NaN   1.2   NaN   NaN  0.2   NaN  NaN   NaN  NaN   
16 27.0  6.0   NaN   NaN   NaN  46.0   NaN  13.0  NaN   NaN  NaN   NaN  NaN   

      N     O     P  
0    NaN   NaN   NaN  
1   25.0  73.0   NaN  
2    NaN   NaN   NaN  
3    NaN   NaN  96.0  
4    NaN   1.0   1.0  
5    NaN   NaN   NaN  
6    NaN   NaN   NaN  
7    NaN   NaN  99.0  
8    NaN   NaN   NaN  
9    NaN   3.0   NaN  
10   NaN   NaN   NaN  
11   NaN   NaN   NaN  
12   NaN   NaN   NaN  
13   NaN   NaN   NaN  
14   NaN   NaN   NaN  
15   NaN   NaN  98.0  
16   NaN   8.0   NaN 

2 个答案:

答案 0 :(得分:2)

如您所知,您希望Xi部分包含新数据框的列名,而Yi部分将是值,则足以更改dict中每一行的位置,其中Xi是键,Yi是值。然后,使用该词典的列表来填充新的数据框:

data = list(df.apply(lambda x: {x['X'+ str(i)]: x['Y'+str(i)] for i in range(1,7)
                                if x['X'+str(i)]!= 'NaN'}, axis=1))

resul = pd.DataFrame(data)
print(resul)

给予:

       A     B     C     D     E     F  ...     K     L    M     N     O     P
0   80.0   NaN  10.0   NaN   NaN   NaN  ...   8.0   NaN  NaN   NaN   NaN   NaN
1    NaN   NaN   NaN   NaN   NaN   2.0  ...   NaN   NaN  NaN  25.0  73.0   NaN
2   70.0   NaN   NaN   NaN   NaN   NaN  ...   NaN   NaN  9.0   NaN   NaN   NaN
3    NaN   0.5   NaN   NaN   NaN   NaN  ...   2.0   NaN  NaN   NaN   NaN  96.0
4   83.0   4.0   NaN   NaN   NaN   9.0  ...   NaN   NaN  NaN   NaN   1.0   1.0
5    1.0  16.0   NaN   NaN   NaN   9.0  ...   NaN   NaN  NaN   NaN   NaN   NaN
6   95.0   2.0   NaN   1.0   NaN   1.0  ...   NaN   1.0  NaN   NaN   NaN   NaN
7    NaN   0.2   NaN   NaN   NaN   0.4  ...   NaN   NaN  NaN   NaN   NaN  99.0
8   35.0   NaN   NaN  12.0   NaN  30.0  ...   NaN  23.0  NaN   NaN   NaN   NaN
9   95.0   0.3   NaN   NaN   NaN   0.1  ...   NaN   NaN  NaN   NaN   3.0   NaN
10   NaN  10.0   NaN   NaN  31.0   NaN  ...   NaN   NaN  NaN   NaN   NaN   NaN
11  24.0   NaN   NaN   NaN   NaN   6.0  ...   NaN   3.0  NaN   NaN   NaN   NaN
12  65.0   NaN  30.0   NaN   NaN   NaN  ...   NaN   NaN  NaN   NaN   NaN   NaN
13  55.0   NaN   NaN   NaN   NaN   6.0  ...   NaN  35.0  NaN   NaN   NaN   NaN
14  22.0   NaN   NaN   NaN   NaN   3.0  ...   0.8  62.2  NaN   NaN   NaN   NaN
15   NaN   0.6   NaN   NaN   NaN   1.2  ...   NaN   NaN  NaN   NaN   NaN  98.0
16  27.0   6.0   NaN   NaN   NaN  46.0  ...   NaN   NaN  NaN   NaN   8.0   NaN

[17 rows x 16 columns]

答案 1 :(得分:0)

一种解决方法。遍历每一行,使用iloc将数据帧分成两半。然后使用zip新建一个字典,然后创建一个结果数据框。

df_dict = {x: list(zip(df.iloc[x,0:6], df.iloc[x,6:12])) for x in range(df.shape[0])}
df1 = pd.DataFrame.from_dict(pd_dict, orient='index')

df1.sort_index(1)

      A     B       C       F   H   I   J       K   M   N        O      P   nan
0   80.0    NaN     10.0    NaN NaN NaN 2.0     8.0 NaN NaN      NaN    NaN NaN
1   NaN     NaN     NaN     2.0 NaN NaN NaN     NaN NaN 25.0    73.0    NaN NaN
2   70.0    NaN     NaN     NaN 6.0 NaN 15.0    NaN 9.0 NaN      NaN    NaN NaN
3   NaN     0.5     NaN     NaN NaN 1.5 NaN     2.0 NaN NaN      NaN    96. NaN
4   83.0    4.0     NaN     9.0 2.0 NaN NaN     NaN NaN NaN      1.0    1.0 NaN