首页 > 解决方案 > 熊猫将行移动到单列并重塑数据框

问题描述

嗨,我有以下数据框约为 1,400,000 行:

x = pd.DataFrame({'ID':['A','B','D','D','F'], 'start1':[1,2,3,4,5], 'start2':[12,11,10,6,7], 'start3':[1,6,2,4,5], 'start4':[5,4,2,3,1], 'start5':[0,0,0,0,0], 'end1':[2,3,4,7,9] })


ID  start1  start2  start3  start4  start5   end1
A   1       12      1       5       0        2
B   2       11      6       4       0        3
D   3       10      2       2       0        4
D   4       6       4       3       0        7
F   5       7       5       1       0        9

我希望将包含列标题“开始”或“结束”的所有行折叠成以下格式:

所需的输出:

ID    start     end
A     1         NaN
A     12        NAN
A     1         NAN
A     5         NaN
A     0         NaN
A     NaN       2
B     2         NaN
B     11        NaN
B     6         NaN
B     4         NaN
B     0         NaN
B     3         NaN
...
F     1         NaN
F     0         NaN
F     NaN       9

我努力了:

joined = df2.apply(lambda x: ' '.join([str(xi) for xi in x]), axis=1)
split = joined.str.split('', expand=True).reset_index(drop=False).melt(id_vars='index')

但是,这似乎耗尽了我所有的内存并且环境崩溃了。任何帮助都会很棒

标签: pythonpandasdataframe

解决方案


尝试meltstartconcat

(pd.concat([x.iloc[:,:-1].melt('ID', value_name='start')
            .sort_values(['ID','variable']).drop('variable',axis=1),
           x[['ID','end1']]
          ])
      .sort_values('ID', kind='mergesort')
     )

输出:

   ID  start  end1
0   A    1.0   NaN
5   A   12.0   NaN
10  A    1.0   NaN
15  A    5.0   NaN
20  A    0.0   NaN
0   A    NaN   2.0
1   B    2.0   NaN
6   B   11.0   NaN
11  B    6.0   NaN
16  B    4.0   NaN
21  B    0.0   NaN
1   B    NaN   3.0
2   D    3.0   NaN
3   D    4.0   NaN
7   D   10.0   NaN
8   D    6.0   NaN
12  D    2.0   NaN
13  D    4.0   NaN
17  D    2.0   NaN
18  D    3.0   NaN
22  D    0.0   NaN
23  D    0.0   NaN
2   D    NaN   4.0
3   D    NaN   7.0
4   F    5.0   NaN
9   F    7.0   NaN
14  F    5.0   NaN
19  F    1.0   NaN
24  F    0.0   NaN
4   F    NaN   9.0

请记住,您正在尝试在这里复制大量数据,因此您需要小心。


推荐阅读