按函数聚合

2024-10-01 22:30:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有如下数据:

id  movie   details value
5   cane1   good    6
5   wind2   ok  30.3
5   wind1   ok  18
5   cane1   good    2
5   cane22  ok  4
5   cane34  good    7
5   wind2   ok  2

我希望输出符合以下条件:

如果电影名称以“cane”开头-求和值

如果电影名称以“wind”开头,请计算发生次数。你知道吗

所以-最终输出将是:

id  movie   value
5   cane1   8
5   cane22  4
5   cane34  7
5   wind1   1
5   wind2   2

我试着用:

movie_df.groupby(['id']).apply(aggr)

def aggr(x):
    if x['movie'].str.startswith('cane'):
        y = x.groupby(['value']).sum()

    else:
         y = x.groupby(['movie']).count()

    return y

但它不起作用。有人能帮忙吗?你知道吗


Tags: 名称id电影valueokmoviegoodgroupby
3条回答

可能有多种方法可以做到这一点。一种方法是先按电影名称的开头进行过滤,然后进行聚合和合并。你知道吗

cane = movie_df[movie_df['movie'].str.startswith('cane1')]
wind = movie_df[movie_df['movie'].str.startswith('wind')]

cane_sum = cane.groupby(['id']).agg({'movie':'first', 'value':'sum'}).reset_index()
wind_count = wind.groupby(['id']).agg({'movie':'first', 'value':'count'}).reset_index()

pd.concat([cane_sum, wind_count])

在可能的情况下,您应该瞄准矢量化操作。你知道吗

您可以计算两个结果,然后将它们串联起来。你知道吗

mask = df['movie'].str.startswith('cane')

df1 = df[mask].groupby('movie')['value'].sum()
df2 = df[~mask].groupby('movie').size()

res = pd.concat([df1, df2], ignore_index=0)\
        .rename('value').reset_index()

print(res)

    movie  value
0   cane1    8.0
1  cane22    4.0
2  cane34    7.0
3   wind1    1.0
4   wind2    2.0

首先,您需要执行字符串操作。我猜在你的情况下,你不想在电影名字里加数字。使用pandas applying regex to replace values中讨论的解决方案。 然后对新序列调用groupby()。你知道吗

仅供参考:有些电影名称只有数字,在这种情况下,您需要使用更新功能。https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.update.html

相关问题 更多 >

    热门问题