如何设置熊猫提取某些列的某些行并将它们堆叠在彼此之上?

时间:2019-04-30 11:56:09

标签: python pandas dataframe

如何提取某些列和行以将它们堆叠在一起?

我使用以下数据创建了一个简单的示例数据框:

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

所需结果中的标题仅用于解释

1 个答案:

答案 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