【发布时间】:2017-06-04 10:25:20
【问题描述】:
我正在尝试根据下面的现有数据框创建一个新的数据框。我的目标是计算点击次数的平均变化并相应地对广告系列进行分类。
现有数据框df:
campaign | date | clicks
A 2015-10-11 255
A 2015-10-12 367
A 2015-10-13 489
B 2015-10-11 500
B 2015-10-15 122
C 2015-10-11 33
目标数据框 df_categorized:
campaign | avg_change | category
A 0.3858 increasing
B -0.756 decreasing
C 0 no change
我尝试了此代码,但收到错误消息 TypeError: 'long' object does not support item assignment
#standard packages
import pandas as pd
import numpy as np
#upload data into df
df = pd.read_csv('C:\Users\xxx\Documents\\ad_table.csv')
df.head()
campaign | date | clicks
A 2015-10-11 255
A 2015-10-12 367
A 2015-10-13 489
B 2015-10-11 500
B 2015-10-15 122
C 2015-10-11 33
#create empty dataframe
columns = ['group','avg_change', 'category']
df_categorized = pd.DataFrame(columns=columns)
df_categorized['avg change'] = df.clicks.apply(lambda df: df.pct_change().abs().mean())
#create column
df_categorized['category'] = 0
# going up
df_categorized['category'][df_categorized['avg change'] > 0] = "increasing"
# going down
df_categorized['category'][df_categorized['avg change'] < 0] = "decreasing"
#no change
df_categorized['category'][df_categorized['avg change'] = 0] = "no change"
【问题讨论】:
-
即使你称它为
df,lambda 函数中的参数也是系列的一个元素,即一个标量。当您将函数应用于系列时(此处为df.clicks),该函数将按元素应用。 -
您可以通过简单的最后减去第一个来跟踪平均变化
-
同样采用
abs的变化不会告诉你谁在减少或增加!
标签: python loops pandas categories