有条件地在熊猫中设置组的值python

我有一个包含以下各列的数据框:


duration, cost, channel 

  2       180      TV1

  1       200      TV2

  2       300      TV3

  1       nan      TV1

  2       nan      TV2

  2       nan      TV3

  2       nan      TV1

  1       40       TV2

  1       nan      TV3

一些成本值是nans,要填充它们,我需要执行以下操作:

  • 按渠道分组

  • 在一个渠道中,将可用成本相加,然后除以*次出现的次数(平均)

  • 重新分配该通道内所有行的值:

    • 如果持续时间= 1,费用=平均值* 1.5

    • 如果持续时间= 2,则费用=平均

示例:TV2频道,我们有3个条目,其中一个条目的费用为零。因此,我需要执行以下操作:

average = 200+40/3 = 80

if duration = 1, cost = 80 * 1.5 = 120


duration, cost, channel 

  2       180      TV1

  1       120      TV2

  2       300      TV3

  1       nan      TV1

  2       80       TV2

  2       nan      TV3

  2       nan      TV1

  1       120      TV2

  1       nan      TV3

我知道我应该做df.groupby('channel')然后将功能应用于每个组。问题是,我不仅需要修改空值,而且如果1成本为空,则需要修改组中的所有成本值。


繁花不似锦
浏览 146回答 2
2回答

回首忆惘然

如果我正确理解您的问题,则需要以下内容:def myfunc(group):    # only modify cost if there are nan's    if len(group) != group.cost.count():        # set all cost values to the mean        group['cost'] = group.cost.sum() / len(group)        # multiply by 1.5 if the duration equals 1        group['cost'][group.duration == 1] = group['cost'] * 1.5    return groupdf.groupby('channel').apply(myfunc)   duration  cost channel0         2    60     TV11         1   120     TV22         2   100     TV33         1    90     TV14         2    80     TV25         2   100     TV36         2    60     TV17         1   120     TV28         1   150     TV3

慕婉清6462132

在新版本的Pandas中,代码应更改为def myfunc(group):    # only modify cost if there are nan's    if len(group) != group.cost.count():        # set all cost values to the mean        group['cost'] = group.cost.sum() / len(group)        # multiply by 1.5 if the duration equals 1        _ = group.set_value(group[group.duration == 1].index, 'cost', group['cost'] * 1.5)    return group
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python