如何将列表放在彼此之下? Python 3.6

时间:2018-01-21 09:33:53

标签: python list pandas

我在Python中有一个Tmp列表,如下所示:

      A1      A2        B1        B2        C1         C2  
0    17.387  17.470     19.93     13.29     19.93     19.93  
1    17.680  17.896     21.85     14.57     21.86     21.86  
2    17.787  17.228     24.46     16.30     24.45     24.45  

我使用此代码选择不同的列:

cols1 = [col for col in cols if '1' in col]
combined1 = combined[cols1]

cols2 = [col for col in cols if '2' in col]
combined21 = combined[cols2]

我想制作一个如下列表:

        A1      A2                         
0     17.387  17.470         
1     17.680  17.896         
2     17.787  17.228      
3       B1      B2   #I also want to delet the titles in between
4     19.93   13.29 
5     21.85   14.57
6     24.46   16.30   
7       C1      C2 
8     19.93   19.93 
9     21.86   21.86  
10    24.45   24.45

我尝试了pd.concatappend,这两个似乎都不起作用。 你有什么解决办法? 提前谢谢!

3 个答案:

答案 0 :(得分:3)

您可以使用boolean mask获取两个子DataFrame(对于1索引和2索引)。 Unstacking会将其中的每一个变成一系列。然后你可以concat这些系列来获得你的结果。

m1 = df.columns.str.endswith('1')
df1 = df.loc[:, m1].unstack().reset_index(drop=True)
df2 = df.loc[:, ~m1].unstack().reset_index(drop=True)
pd.concat((df1, df2), axis=1, ignore_index=True)

返回

        0       1
0  17.387  17.470
1  17.680  17.896
2  17.787  17.228
3  19.930  13.290
4  21.850  14.570
5  24.460  16.300
6  19.930  19.930
7  21.860  21.860
8  24.450  24.450

答案 1 :(得分:3)

你可以这样做:

In [32]: pd.concat([df[g].rename(columns=lambda c:'A'+c[-1])
    ...:            for g in df.groupby(df.columns.str[0], axis=1).groups.values()],
    ...:           ignore_index=True)
    ...:
Out[32]:
       A1      A2
0  17.387  17.470
1  17.680  17.896
2  17.787  17.228
3  19.930  13.290
4  21.850  14.570
5  24.460  16.300
6  19.930  19.930
7  21.860  21.860
8  24.450  24.450

答案 2 :(得分:2)

使用Pandas重塑的另一种方法:

d1 = df.T
g = d1.index.str[0]
df_out = d1.set_index([g,d1.groupby(g).cumcount()])\
           .stack().unstack(1).reset_index(drop=True)

输出:

        0       1
0  17.387  17.470
1  17.680  17.896
2  17.787  17.228
3  19.930  13.290
4  21.850  14.570
5  24.460  16.300
6  19.930  19.930
7  21.860  21.860
8  24.450  24.450