2017-02-09 3 views
1

セグメンテーション: - 2の倍数に「終了」行方向データフレームには、次のデータフレームを考える

df = pd.DataFrame(data={'item': [1, 2, 3, 4], 'start':[0.0, 2.0, 8.0, 6.0], 
          'end': [2.0, 6.0, 8.0, 14.0]}) 

どのように私はすぐに間隔「スタート」をセグメント化することにより、上記データフレームの行単位を拡大していますか?

上記の例では、結果のデータフレームは、私がチェックするために何百万行を持っているよう

Out= 
     item start end  
     1  0.0  2.0 
     2  2.0  4.0 
     2  4.0  6.0 
     3  8.0  8.0 
     4  6.0  8.0 
     4  8.0  10.0 
     4  10.0 12.0 
     4  12.0 14.0 

パフォーマンスは、私にとって最も重要であるべきです。 セグメント化を必要としない行に対してブールインデックスを使用してデータフレーム全体をすでにフィルタリングしていました。それはすばらしいスピードアップです。しかし、残りの行では、「forループ」を適用し、追加した正しい長さのデータフレームを作成しました。残念ながら、パフォーマンスは何百万行も十分ではありません。

専門家のソリューションを楽しみにしています!

答えて

0

スタート:最初のデータフレームがエラーを含んでいることを

lengths = pd.Series([1, 2, 1, 4]) # For the example, I just created this array, 
             # but obviously I would use the mod function to 
             # determine the number of segments to create 

    # Row below elongates the dataframe according to the array 'lengths' 

    df = df.reindex(np.repeat(df.index.values, lengths), method='ffill') 
    df['start'] += pd.Series(df.groupby(level=0).cumcount()*2.0) 
    df['end'] = df['start'] + 2.0 
    print df 

注:

その後
import pandas as pd 
    import numpy as np 
    df = pd.DataFrame(data={'item': [1, 2, 3, 4], 'start':[0.0, 2.0, 8.0, 6.0], 
          'end': [2.0, 6.0, 10.0, 14.0]}) 

、次のコードを実行します。項目 '3'は '開始= 8.0'と '終了= 10.0'を必要としました。

この方法は、パンダのCython機能の使用により非常に迅速だと思います。もちろん、他の可能性にまだ開いています。

0

拡張された開始時刻と終了時刻のDataFrameを返す関数を記述できます。この例では、itemとグループ化しています。最初にグループ化されていないapplyからDataFrameを返すことはできません。元データフレームから

def convert(row): 
    start = row.start.values[0] 
    end = row.end.values[0] 
    if start == end: 
     return pd.DataFrame([[start, end]], columns=['start', 'end']) 
    else: 
     return pd.DataFrame({'start': np.arange(start, end, 2), 
          'end':np.arange(start + 2, end + 2, 2)}, 
          columns=['start', 'end']) 

df1=df.groupby('item').apply(convert) 
df1.index = df1.index.droplevel(1) 
df1.reset_index() 

    item start end 
0  1 0.0 2.0 
1  2 2.0 4.0 
2  2 4.0 6.0 
3  3 8.0 8.0 
4  4 6.0 8.0 
5  4 8.0 10.0 
6  4 10.0 12.0 
7  4 12.0 14.0 
+0

ありがとうございます。私はこれまで同様のことをしていました。私ははるかに速いと信じている代替ソリューションを投稿しました。 –

関連する問題