【问题标题】:Getting column mean in groupby clause python pandas在groupby子句python pandas中获取列均值
【发布时间】:2018-11-17 17:59:41
【问题描述】:

我有一个演员和导演的数据集,以及他们合作过的电影的受欢迎程度。

print (actors_director_df.head(3))

                 actor         director  popularity counter
0          Chris Pratt  Colin Trevorrow   32.985763       0
1  Bryce Dallas Howard  Colin Trevorrow   32.985763       0
2          Irrfan Khan  Colin Trevorrow   32.985763       0

我想使用演员和导演进行分组,因为一对可以在不止一部电影中工作。我成功地使用了下面的查询。

actor_director_grouped = actors_director_df.groupby(['actor','director']) \
                         .size() \
                         .reset_index(name='count') \
                         .sort_values(['count'], ascending=False) \
                         .head(10)

print (actor_director_grouped)

                      actor            director  count
3619         Clint Eastwood      Clint Eastwood     14
19272           Woody Allen         Woody Allen     12
9606            Johnny Depp          Tim Burton      8

但此 DF 中缺少流行度列。

我想做的是在groupby之后做一个人气平均值列,并在演员和导演面前显示平均值以及他们一起制作的电影数量。

即我的理想输出应该是这样的。

                      actor            director  popularity count
3619         Clint Eastwood      Clint Eastwood   32.985763    14
19272           Woody Allen         Woody Allen   5.1231231    12
9606            Johnny Depp          Tim Burton   3.1231231    8

【问题讨论】:

  • 可能想使用aggmean 来获得人气,sum 来获得计数
  • 您能否将稍大的数据框样本发布为易于重新创建的字典? (实际上也显示了更多组)
  • 不是重复但非常相似:stackoverflow.com/questions/38174155/…

标签: python pandas pandas-groupby


【解决方案1】:

查看您的数据框,counter 列似乎没有必要。让我们改为使用流行度列并制作一个mean 和一个count 列:

import pandas as pd
import numpy as np

np.random.seed(444)

names = [
    'Robert Baratheon',
    'Jon Snow',
    'Daenerys Targaryen',
    'Theon Greyjoy',
    'Tyrion Lannister'
]

df = pd.DataFrame({
    'actor': np.random.choice(names, size=10, p = [0.2,0.2,0.2,0.1,0.3]),
    'director': np.random.choice(names, size=10, p = [0.4,0.1,0.1,0.1,0.3]),
    'popularity': np.random.randint(0,100, size=10),
    'counter': 0
})

df2 = df.groupby(['actor','director'])['popularity']\
        .agg(['count', 'mean'])\
        .reset_index()\
        .sort_values(by='mean', ascending=False)

print(df2)

返回:

              actor          director  count  mean
0          Jon Snow  Robert Baratheon      2  53.5
5  Tyrion Lannister  Tyrion Lannister      2  49.0
2  Robert Baratheon  Tyrion Lannister      2  48.5
1  Robert Baratheon          Jon Snow      2  40.5
4     Theon Greyjoy  Tyrion Lannister      1  13.0
3     Theon Greyjoy  Robert Baratheon      1   7.0

【讨论】:

  • 这是一个更好的答案。 ~+1
  • @HarvIpan 谢谢。不是 100% 确定这是 OP 想要的,因为它有时很难解释。你的回答也有一些不错的地方。
  • 我同意。有时解释可能令人怀疑。我特别不喜欢我的答案中的.merge() 部分。在这方面,您的回答应该更快。
  • 谢谢大家。这就是我想要的。现在我必须明白答案了:D
  • 最后一个问题。如何仅获取计数大于 1 的行?执行 df2 = df2[count > 1] 在均值和计数列中产生大量 NaN
【解决方案2】:

我冒昧地添加了一些有助于更好地理解groupby 子句的虚拟数据。

print(df)

输出:

                   actor           director  popularity  counter
0           Chris Pratt    Colin Trevorrow   32.985763        0
1   Bryce Dallas Howard    Colin Trevorrow   32.985763        0
2           Irrfan Khan    Colin Trevorrow   32.985763        0
3           Irrfan Khan    Colin Trevorrow   60.000000       12
4           Irrfan Khan       John Markson   10.000000       10
5           Irrfan Khan       Mark Johnson  100.000000        4

然后你需要在actordirector 上找到groupby,然后找到mean 对应popularitysum 对应count

g = df.groupby(['actor', 'director'], as_index=False)
count = g.size().reset_index(name='count')
grp = g.agg({'popularity':'mean'})
grp.merge(count)

输出:

                 actor         director  popularity  count
0  Bryce Dallas Howard  Colin Trevorrow   32.985763      1
1          Chris Pratt  Colin Trevorrow   32.985763      1
2          Irrfan Khan  Colin Trevorrow   46.492881      2
3          Irrfan Khan     John Markson   10.000000      1
4          Irrfan Khan     Mark Johnson  100.000000      1

【讨论】:

  • @chrisz,在 OP 的问题中,柜台是 0s。我保持原样。
  • @HarvIpan 我在 df 中添加了计数器列。我对这件事很陌生。但克里斯是对的。我想计算他们一起制作的电影数量以及受欢迎程度的平均值。
猜你喜欢
  • 2021-10-20
  • 1970-01-01
  • 2020-03-09
  • 2018-10-02
  • 2015-05-04
  • 2020-05-16
  • 2013-05-17
  • 1970-01-01
  • 2020-05-08
相关资源
最近更新 更多