我有一个数据框,其中包含兴趣点的用户评分。我需要将同一位置(attr_name
)中同一位置(reviewer_link
)的行替换为平均评分(reviewer_demographics_residence_state
)用户给了。所以
review_rate
正确计算方法:
csv_df = pd.DataFrame(OrderedDict({'reviewer_link': [1, 2, 3, 4, 1, 2, 3, 4],
'reviewer_demographics_residence_state': [
'greece', 'greece', 'greece', 'greece', 'greece',
'italy', 'greece', 'greece'],
'attr_name': ['uffizi', 'uffizi', 'uffizi',
'uffizi', 'uffizi2', 'uffizi',
'uffizi', 'uffizi', ],
'review_rate': [1, 2, 3, 4, 4, 3, 2, 1],
'dummy': [1, 2, 3, 4, 4, 3, 2, 1]
}))
csv_df['review_rate'] = csv_df.groupby(
['reviewer_demographics_residence_state', 'reviewer_link', 'attr_name'])[
'review_rate'].transform('mean')
print(csv_df)
但是我不能完全用这些方法来替换原始数据框中的行(因此每个国家/用户/ PoI有一行,平均值为等级)
编辑:预期输出(手工制作):
reviewer_link reviewer_demographics_residence_state attr_name review_rate dummy
0 1 greece uffizi 1.0 1
1 2 greece uffizi 2.0 2
2 3 greece uffizi 2.5 3
3 4 greece uffizi 2.5 4
4 1 greece uffizi2 4.0 4
5 2 italy uffizi 3.0 3
6 3 greece uffizi 2.5 2
7 4 greece uffizi 2.5 1
所以虚拟列保留第一个值。当然csv_df包含更多列
答案 0 :(得分:1)
您需要按mean
列review_rate
和first
输出所需的所有其他列进行汇总:
csv_df = (csv_df.groupby ['reviewer_demographics_residence_state',
'reviewer_link', 'attr_name'])
.agg( {'review_rate': 'mean', 'dummy': 'first'})
.reset_index())
print (csv_df)
reviewer_demographics_residence_state reviewer_link attr_name review_rate \
0 greece 1 uffizi 1.0
1 greece 1 uffizi2 4.0
2 greece 2 uffizi 2.0
3 greece 3 uffizi 2.5
4 greece 4 uffizi 2.5
5 italy 2 uffizi 3.0
dummy
0 1
1 4
2 2
3 3
4 4
5 3