这是我的代码:
all_data = pd.merge(all_data, meanData, suffixes=["", "_mean"], how='left', on=['id', 'id2'])
现在,我想合并all_data
和meanData
,但我希望 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