Python 如何计算单列的多个平均值,根据另一列中的值选择要平均的行

标签 python pandas

[编辑:在底部重写问题]

我试图弄清楚如何计算“部分列”平均值和计数,而不是使用所有值。在伪 SQL 中,我想SELECT所有值WHERE id = 10,然后= 20等。我假设有一种Pythonic(pandastic?)方法在不使用 for 循环的情况下执行此操作。

示例:df 有 3 列和数千行:caseidvalue。 case 唯一,id 可以重复,value 为数字。

case    id  value
1       10  100
2       10  500
3       20  200
4       20  150
5       20  125

我想对每个 id 的值进行计数并计算平均值,并将它们放入新列中。 。 .

case    id  value   n_vals  av_val
1       10  100     2       300
2       10  500
3       20  300     3       200
4       20  150
5       20  150

。 。 。然后删除 casevalue 并为每个 id 只保留一行(现在是唯一的):

id  n_vals  av_val
10  2       300
20  3       200

我知道如何查找整个列的 lenmean,但不知道如何查找像这样的部分列。

<小时/>

[重写问题]:

我有一个 df,有 7 个变量,有 20000265 个 obs。 case 是唯一的,Id 可以重复。:

case        Id      title           n_words n_chars rating  rating2
20000260    131258  The Pirates     2       11      2.5     2.5
20000261    131258  The Pirates     2       11      3.5     3.5
20000262    131258  The Pirates     2       11      4.5     4.5
20000263    131260  Rentun Ruusu    2       12      3       3
20000264    131260  Rentun Ruusu    2       12      5       5
20000265    131262  Innocence       1       9       4       4

我想计算每个 Id 的评分数量和平均评分。这些值作为 n_ ratingsav_ rating 添加到 df,替换 rating rating2,聚合在单行上对于每个Id。我想保留所有其他列,生成如下内容:

case        Id      title           n_words n_chars n_ratings   av_rating
20000260    131258  The Pirates     2       11      3           3.5
20000263    131260  Rentun Ruusu    2       12      2           4
20000265    131262  Innocence       1       9       1           4

根据下面@U9_Forward的回答,我已经尝试过:

df = 
    (df.
        groupby('Id', as_index = False).
        agg({'rating':'count', 'rating2':'mean'}).
        # rename(columns = {'rating':'n_ratings', 'rating2':'av_rating'}))
        rename(columns = {'Id':'Id', 'title':'title',
                      'num_words':'num_words', 'num_chars':'num_chars',
                      'rating':'n_ratings', 'rating2':'av_rating'}, axis=1))

但是,这仅保留在 groupby( ).agg() 管道,例如:

0   1   49695       3.921240
1   2   22243       3.211977
2   3   12735       3.151040

我尝试在 rename() 字典中包含所有列名称,但得到了相同的结果。

两个问题:

  1. 是否有agg()的参数或其他方法来实现 想要的结果?
  2. 我在 Jupyter 中收到 FutureWarning 并已阅读该内容 使用带有 rename() 的字典已被弃用或很快将被弃用。什么是 重命名列的新首选方法?

最佳答案

只需使用 groupbyaggrename :

print(df.groupby('id',as_index=False).agg({'case':'count','value':'mean'}).rename({'case':'n_vals','value':'av_val'},axis=1))

输出是:

   id  n_vals  av_val
0  10       2     300
1  20       3     200

编辑:

df[['n_ratings','av_rating']]=df[['Id','title']].join(df.groupby(['Id','title']).agg({'rating':'count','rating2':'mean'}), on=['Id','title'])[['rating','rating2']]
print(df.drop_duplicates(keep='last',subset='Id'))

关于Python 如何计算单列的多个平均值,根据另一列中的值选择要平均的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53953316/

相关文章:

Python。如何优化搜索功能

python - 在 Scrapy 中抓取和连接

Python .csv转pandas dataframe绘制bokeh的烛台图

python - 通过 XML 解析时记录被删除

python - 有没有一种方法可以在 pandas/numpy 中使用升序逻辑进行前向填充?

python - 在 json 中保存 PIL 图像的最佳方法是什么

Python - 导入全局/站点包模块而不是本地目录中的同名文件

Python Pandas : apply on separated values

python - Pandas pivot_table 日期

python - pandas 数据帧上的数据透视表操作