应用func以根据Pandas中其他列的值生成新列

时间:2015-08-28 00:34:01

标签: python pandas apply

我正试图获得平均值。通过'pageviews'

潜入页面上花费的总时间,花在页面上的时间

部分数据框:

>      Page          Month  Pageviews   Users   Time on Page (HH:MM:SS)
> 0 /Products/..    201503  1925        1006    27:43:45
> 1 /Products/..    201502  1811        930     26:32:33
> 2 /Products/..    201504  1781        969     28:05:38

我写了一个函数将(HH:MM:SS)转换成秒并将生成的数字(x)除以#pageviews(y)

def avg_time_on_page(x,y):
    return (60*60*int(x.split(':')[0])+60*int(x.split(':')[1])+int(x.split(':')[2]))/y

尝试使用以下代码

创建名为“AvgTimeOnPage”的col
df['AvgTimeOnPage'] = df[['Time on Page','Pageviews']].apply(avg_time_on_page, axis=1)

得到错误消息

TypeError: ('avg_time_on_page() takes exactly 2 arguments (1 given)', u'occurred at index 0')

我的问题是 -

当我将“该功能”应用于“页面上的时间”和“ 'Pageviews'列,是否会将两列中的值作为参数并返回一个值,即'AvgTimeOnPage'作为输出?我不太明白错误消息,说'1'是arg,而不是'2'

有人可以解释为什么它不起作用?谢谢!

1 个答案:

答案 0 :(得分:2)

确保列是timedelta:

In [11]: df.iloc[:, 4]  # lazy way to access column with long name...
Out[11]:
0    27:43:45
1    26:32:33
2    28:05:38
Name: Time on Page (HH:MM:SS), dtype: object

In [12]: pd.to_timedelta(df.iloc[:, 4])
Out[12]:
0   1 days 03:43:45
1   1 days 02:32:33
2   1 days 04:05:38
Name: Time on Page (HH:MM:SS), dtype: timedelta64[ns]

注意:您可能需要设置此列。

然后你可以划分:

In [13]: pd.to_timedelta(df.iloc[:, 4]) / df['Pageviews']
Out[13]:
0   00:00:51.857142
1   00:00:52.762562
2   00:00:56.787198
dtype: timedelta64[ns]