2016-11-09 2 views
1

私はタイムスタンプで順序付けられたデータのグループをマークしています。これを開始タイムスタンプと最終タイムスタンプに減らし、そのグループのそのマークに対応する。例開始データフレーム:私が達成したい何特定の列の最初のタイムスタンプと最後のタイムスタンプと平均値を含む行へのスカッシュデータフレーム

  timestamp   value  mark 
1 2016-11-07 11:00:00  0.781726  1 
2 2016-11-07 11:03:00  0.812757  2 
3 2016-11-07 11:05:00  0.845348  2 
4 2016-11-07 11:07:00  0.817394  2 
5 2016-11-07 11:11:00  0.760787  1 
6 2016-11-07 11:13:00  0.807892  1 
7 2016-11-07 11:15:00  0.812965  1 
8 2016-11-07 11:18:00  0.822001  1 

 start_timestamp   end_timestamp (mean_)value mark 
1 2016-11-07 11:00:00 2016-11-07 11:00:00  0.781726  1 
2 2016-11-07 11:03:00 2016-11-07 11:07:00  0.825166  2 
3 2016-11-07 11:11:00 2016-11-07 11:18:00  0.800911  1 

これを行うための最善の方法の任意のアイデア?最初に一意のマークで各バッチをマークする必要がありますか?

+0

、マークを一意に、 'groupby'を行い、最初と最後のアイテムを取りますstart/end_timestampのそのグループ内で値の平均値を計算します。 – Mathias711

答えて

3

あなたが重複した列markからユニークgroupsSeriesによってgroupby、その後aggregatefirstlastmeanが必要です

確か
print ((df.mark != df.mark.shift()).cumsum()) 
1 1 
2 2 
3 2 
4 2 
5 3 
6 3 
7 3 
8 3 
Name: mark, dtype: int32 

df1 = df.groupby((df.mark != df.mark.shift()).cumsum()) \ 
     .agg({'timestamp': ['first','last'], 'value':'mean', 'mark': 'first'}) 

#reset MultiIndex in columns 
df1.columns = ['_'.join(col) for col in df1.columns] 
#if necessary rename columns 
df1 = df1.rename(columns=({'timestamp_first':'start_timestamp', 
          'timestamp_last':'end_timestamp', 
          'mark_first':'mark','value_mean':'(mean_)value'})) \ 
      .rename_axis(None) 

print (df1)   
     start_timestamp  end_timestamp mark (mean_)value 
1 2016-11-07 11:00:00 2016-11-07 11:00:00  1  0.781726 
2 2016-11-07 11:03:00 2016-11-07 11:07:00  2  0.825166 
3 2016-11-07 11:11:00 2016-11-07 11:18:00  1  0.800911 
+0

ありがとう!私は実際には左にもっと多くの列を持っています。どのように私はそれらを置くので、私はその情報を失うことはありませんか?グループやグループで?または、私は最初にこの操作の前にグループ化する必要があります。 – Ross

+0

別の列がある場合は、集計もなければなりません。 .agg({'タイムスタンプ':['first'、 'last']、 'value': '平均'、 'マーク': 'first'、 'col1': ' 'first'、 'col2': 'mean'、 'col3': 'cum'}) '' – jezrael

関連する問題