如何用pandas DataFrame在多列组中通过它们的方式替换行?

时间:2018-01-30 14:56:45

标签: python pandas dataframe pandas-groupby

我有一个数据框,其中包含兴趣点的用户评分。我需要将同一位置(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包含更多列

1 个答案:

答案 0 :(得分:1)

您需要按meanreview_ratefirst输出所需的所有其他列进行汇总:

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