在pandas条件python中设置组的值

ybb*_*ybb 1 python group-by missing-data pandas

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

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
Run Code Online (Sandbox Code Playgroud)

一些成本值是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
Run Code Online (Sandbox Code Playgroud)

我知道我应该做df.groupby('channel'),然后将函数应用于每个组.问题是我不仅需要修改空值,还需要修改组中的所有成本值,如果1 cost为null.

任何提示帮助将不胜感激.

谢谢!

Rut*_*ies 7

如果我正确理解您的问题,您需要以下内容:

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 group


df.groupby('channel').apply(myfunc)

   duration  cost channel
0         2    60     TV1
1         1   120     TV2
2         2   100     TV3
3         1    90     TV1
4         2    80     TV2
5         2   100     TV3
6         2    60     TV1
7         1   120     TV2
8         1   150     TV3
Run Code Online (Sandbox Code Playgroud)