3

次の列を持つデータフレームがあります。

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 つのエントリがあり、1 つのエントリのコストは null です。だから私は次のことをする必要があります:

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') を実行してから、各グループに関数を適用する必要があることを知っています。問題は、null 値だけでなく、1 つのコストが null の場合、グループ内のすべてのコスト値を変更する必要があることです。

どんなヒントでも助けていただければ幸いです。

ありがとう!

4

2 に答える 2

8

あなたの問題を正しく理解していれば、次のようなものが必要です。

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
于 2013-06-14T08:02:17.843 に答える
2

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
于 2016-10-04T19:56:29.457 に答える