根据列后缀对列重新排序

时间:2018-12-25 14:48:44

标签: python pandas

这是我的代码:

all_data = pd.merge(all_data, meanData, suffixes=["", "_mean"], how='left', on=['id', 'id2'])

现在,我想合并all_datameanData,但是我希望meanData列首先出现。

赞:

  

a_mean,b_mean,c_mean,a,b,c

不是这样

  

a,b,c,a_mean,b_mean,c_mean

注意:我有很多列,所以我不想手动编写代码来更改索引。

示例代码(您可以复制):

import pandas
df = pd.DataFrame([[0,1, 2], [0,1, 3], [0,4, 6],[1,3,4],[1,4,2]], columns=['id','A', 'B'])
features = ['A','B']
meanData = df.groupby(['id'])[features].agg('mean')
df = pd.merge(df, meanData, suffixes=["", "_mean"], how='left', on=['id'])
print(df.columns)

输出

  

索引(['id','A','B','A_mean','B_mean'],dtype ='object')

预期输出:

  

Index([['A_mean','B_mean','id','A','B'],dtype ='object')

2 个答案:

答案 0 :(得分:2)

我认为您可以在groupby之后使用transform来获取与每一行相关的mean,然后pd.concat这样的数据帧,例如:

new_df = pd.concat([(df.groupby('id')[features]
                       .transform(np.mean).add_suffix('_mean')), df],
                   axis=1)
print (new_df)
   A_mean    B_mean  id  A  B
0     2.0  3.666667   0  1  2
1     2.0  3.666667   0  1  3
2     2.0  3.666667   0  4  6
3     3.5  3.000000   1  3  4
4     3.5  3.000000   1  4  2

答案 1 :(得分:2)

您可以使用sorted()合并和重新排序列:

v = pd.merge(df, meanData, suffixes=["", "_mean"], how='left', on=['id'])
v[sorted(v.columns, key=lambda x: 'mean' not in x)]

   A_mean    B_mean  id  A  B
0     2.0  3.666667   0  1  2
1     2.0  3.666667   0  1  3
2     2.0  3.666667   0  4  6
3     3.5  3.000000   1  3  4
4     3.5  3.000000   1  4  2