2017-01-19 9 views
1

下記の既存のデータフレームに基づいて新しいデータフレームを作成しようとしています。私は、クリックの平均変化を計算し、それに応じてキャンペーンを分類することを目指しています。グループ別のトレンド変更を見る(python pandas dataframe)

既存のデータフレーム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を得る: '長い' オブジェクトは、アイテムの割り当てをサポートしていません

#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" 
+0

を参照してください 'df'、ラムダ関数の引数は、系列の要素、すなわちスカラです。シリーズ(ここでは 'df.clicks')に関数を適用すると、その関数は要素ごとに適用されます。 – IanS

+0

あなたは単純な最後のマイナス最初に平均変化を追跡することができます – piRSquared

+0

また、変更の 'abs'を取っても、減少しているか増えているのかは分かりません! – IanS

答えて

2

groupbyは「キャンペーン」、次にapplylambdapct_changeを計算し、meanを返します。次に、この上reset_indexをすることができますし、np.whereを使用して、あなたの追加カテゴリ欄を追加します。

In [239]: 
gp = df.groupby('campaign')['clicks'].apply(lambda x: x.pct_change().mean()).reset_index(name='avg_change').fillna(0) 
gp['category'] = np.where(gp['avg_change'] < 0, 'decreasing', np.where(gp['avg_change'] > 0, 'increasing', 'no change')) 
gp 

Out[239]: 
    campaign avg_change category 
0  A  0.38582 increasing 
1  B -0.75600 decreasing 
2  C  0.00000 no change 

この:

df_categorized['avg change'] = df.clicks.apply(lambda df: df.pct_change().abs().mean()) 

が動作しませんラムダがそれぞ​​れになりますので、あなたが列にapplyを呼んでいます

この無しでも
AttributeError: 'int' object has no attribute 'pct_change' 

それはあなたを与えるものではありません。この場合には、したがって、あなたがエラーを取得するintある行要素とにかくキャンペーンごとのpct_change。

はまた、このようなあなたのDFでないチェーンの呼び出しを行います。

df_categorized['category'][df_categorized['avg change'] > 0] = "increasing" 

が、それは次のようになります。

df_categorized.loc[df_categorized['avg change'] > 0, 'category'] = "increasing" 

は、あなたがそれを呼び出す場合でもdocs

+0

ありがとう!これは非常に参考になりましたが、私はそれらを今後も使用していきたいと思います。上記のコードをデータセット全体で実行すると、私は肯定的な変化または "inf"しか得られません。 – jeangelj

+0

無限の数を意味します。おそらくどこかで0で割っていることを意味します。 – EdChum

+0

です。私はdropnaまたはdf = df [df.clicks!= 0]を使ってそれらの値を削除する必要がありますか? – jeangelj

関連する問題