根据列后缀对列重新排序



这是我的代码:

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)

输出

index(['id', 'A', 'B', '

A_mean', 'B_mean'], dtype='object')

预期产出:

索引(['A_mean', 'B_mean','id', 'A', '

B'], dtype='object')

我认为您可以在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
您可以使用

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

最新更新