如何提取某些列和行以将它们堆叠在一起?
我使用以下数据创建了一个简单的示例数据框:
data = {'d1':[101,201,301,401],
'd2':[102,202,302,402],
'd3':[103,203,303,403],
'd4':[104,204,304,404]
}
dfa = pd.DataFrame(data, index=['t1','t2','t3','t4'])
dfa
d1 d2 d3 d4
t1 101 102 103 104
t2 201 202 203 204
t3 301 302 303 304
t4 401 402 403 404
这就是我想要得到的:
d1_d2_d3-t1-t2
1 101
2 201
3 102
4 202
5 103
6 203
我想获得的另一种格式是两列:
d1_d2_d3-t1-t2 d1_d2_d3-t3-t4
1 101 301
2 201 401
3 102 302
4 202 402
5 103 303
6 203 403
所需结果中的标题仅用于解释
答案 0 :(得分:1)
使用DataFrame.loc
进行过滤,使用DataFrame.melt
进行整形:
idx = ['t1','t2']
cols = ['d1','d2', 'd3']
df = dfa.loc[idx, cols].melt(value_name='data')[['data']]
另一种解决方案是将值转换为numpy数组,并用numpy.ravel
进行展平,并通过构造函数创建新的DataFrame:
df = pd.DataFrame({'data': dfa.loc[idx, cols].values.ravel()})
print (df)
data
0 101
1 201
2 102
3 202
4 103
5 203
idx1 = ['t1','t2']
idx2 = ['t3','t4']
cols = ['d1','d2', 'd3']
df = pd.concat([dfa.loc[idx1, cols].melt(value_name='data1')[['data1']],
dfa.loc[idx2, cols].melt(value_name='data2')[['data2']]], axis=1)
或者:
df = pd.DataFrame({'data1': dfa.loc[idx1, cols].values.ravel(),
'data2': dfa.loc[idx2, cols].values.ravel()})
print (df)
data1 data2
0 101 301
1 201 401
2 102 302
3 202 402
4 103 303
5 203 403