我在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.concat
,append
,这两个似乎都不起作用。
你有什么解决办法?
提前谢谢!
答案 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