2017-04-24 10 views
2

指定されたアイテムのステータス変更を示すレコードのリストがあります。したがって、各レコードは、アイテム、アクティブステータス(0または1)、およびステータスが変更された日付を示します。前の値を考慮して、期間あたりの値カウント

小さな例:

import pandas as pd 
data = [ 
    {"item": "A", "active": 1, "date": "2016-01-01"}, 
    {"item": "B", "active": 1, "date": "2016-02-01"}, 
    {"item": "C", "active": 0, "date": "2016-02-10"}, 
    {"item": "B", "active": 0, "date": "2016-03-01"}, 
    {"item": "A", "active": 0, "date": "2016-04-01"}, 
] 
df = pd.DataFrame(data) 

# active  date item 
# 0  1 2016-01-01 A 
# 1  1 2016-02-01 B 
# 2  0 2016-02-10 C 
# 3  0 2016-03-01 B 
# 4  0 2016-04-01 A 

Iは、時間当たりの存在中項目の数を示すために、集約を計算したいです。番号にはステータスが変更されていないアイテムが含まれている必要があります(この例では、2月または3月にはAは記載されていませんが、両方でカウントする必要があります)。したがって、上記の例では、これは正しい結果になります:

month active_count 
-------------------- 
2016-01 1 
2016-02 2 
2016-03 1 
2016-04 0 

はどのように我々は、期間の数の計算内のアイテムの最新の値が含まれていますか?

df = df.set_index('date') 
df.index = pd.to_datetime(df.index) 

はgroupging、リサンプリングと加算を行います:

答えて

0

のは、データを準備しgroupbyresample

のコピーを使用してみましょう

df_month = (df.groupby('item').apply(lambda x: x.resample('MS').sum()) 
    .fillna(method='ffill').reset_index('item') 
    .groupby(level=0).sum()) 

ハードワークが行われ、今みましょうクリーンアップと名前を変更してください:

df_month['month'] = df_month.index.strftime('%Y-%m') 

df_month = df_month.reset_index(drop=True).rename(columns={'active':'active_count'}) 

print(df_month[['month','active_count']]) 

出力:あなたが使用することができます

 month active_count 
0 2016-01   1.0 
1 2016-02   2.0 
2 2016-03   1.0 
3 2016-04   0.0 
1

df['date'] = pd.to_datetime(df['date']).dt.to_period('M') 
df1 = df.set_index('date') 
     .groupby('item') 
     .resample('M') 
     .ffill() 
     .groupby(level=1)['active'] 
     .sum() 
     .reset_index(name='active_count') 

print (df1) 
    date active_count 
0 2016-01    1 
1 2016-02    2 
2 2016-03    1 
3 2016-04    0 
+0

のEVELは、これは正しく動作していないと思われます。サンプルデータを 'data = [{" item ":" A "、" active ":1、" date ":" 2016-01-01 "}、{" item ":" B " "active":1、 "date": "2016-02-01"}、{"item": "C"、 "active":1、 "date": "2016-02-10"}、{item ":" B "、" active ":0、" date ":" 2016-03-01 "}、{" item ":" A "、" active ":0、" date ":" 2016-04-01 "}]'ならば、 '2016-2'と '2016-03'の' active_count'はそれぞれ '3'と' 2'でなければなりません。上記のコードでは、これらの期間に '3'と' 1'が得られます。 –

関連する問題