繁体   English   中英

如何通过熊猫DataFrame的多列groupby替换行?

[英]How to replace rows by their means in a multiple columns groupby pandas DataFrame?

我有一个数据框,其中包含兴趣点的用户评分。 我需要更换为同一个地方(行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)

正确计算均值:

   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

但是我不能完全用那些方法替换原始数据框中的行(因此每个国家/用户/兴趣点各占一行,均值作为评分)

编辑:预期的输出(手工制作):

reviewer_demographics_residence_state reviewer_link attr_name  review_rate  dummy
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      4  
italy                                 2             uffizi             3.0      3  

因此虚拟列保留第一个值。 当然,csv_df包含更多列

您需要通过总meanreview_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  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM