这是我的代码:
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)
输出
索引(['id','A','B','A_mean','B_mean'],dtype ='object')
预期输出:
Index([['A_mean','B_mean','id','A','B'],dtype ='object')
答案 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