2017-03-30 11 views
2

DataFrameの各列から、毎週最も頻繁に値を取得したいのはdatetimeです。 DataFrameのエントリがすべてintまたはfloatのときにこれを行うことができます。しかし、データ型がintまたはfloatであることを利用しない一般的な方法を探しています。ここ パンダのDataFrameでの週単位の操作

DataFrame内の各エントリは、例えば、あるtuple:これは内週最も頻繁タプルからなるDataFrameに変換されなければならない

2015-11-15 00:00:00 (3, 10.0, 0) nan 
2015-11-16 00:00:00 nan   nan 
2015-11-17 00:00:00 nan   nan 
2015-11-18 00:00:00 (3, 10.0, 0) nan 
2015-11-19 00:00:00 (3, 10.0, 0) nan 
2015-11-20 00:00:00 (4, 8.2, 0) nan 
2015-11-21 00:00:00 (4, 8.2, 0) nan 
2015-11-22 00:00:00 (4, 8.2, 0) (1, 1.4, 1) 
2015-11-23 00:00:00 (3, 18.0, 1) (3, 10.0, 0) 
2015-11-26 00:00:00 (4, 8.2, 0) (1, 1.4, 1) 
2015-11-27 00:00:00 (4, 8.2, 0) (3, 10.0, 0) 
2015-11-28 00:00:00 nan   (1, 1.4, 1) 
2015-11-29 00:00:00 (4, 8.2, 0) (3, 10.0, 0) 
2015-11-30 00:00:00 (4, 8.2, 0) (1, 1.4, 1) 

次のよう

2015-11-15 00:00:00 (3, 10.0, 0) nan 
2015-11-22 00:00:00 (4, 8.2, 0) (1, 1.4, 1) 

私の好みは効率性です。スピードは私のアプリケーションでは本当に重要です。

EDIT

  3046920017503 3046920017541 
index         
2015-11-15   NaN   NaN 
2015-11-16   NaN   NaN 
2015-11-17   NaN   NaN 
2015-11-18   NaN   NaN 
2015-11-19   NaN   NaN 
2015-11-20   NaN   NaN 
2015-11-21   NaN   NaN 
2015-11-22   NaN   NaN 
2015-11-23   NaN   NaN 
2015-11-24   NaN   NaN 
2015-11-25   NaN   NaN 
2015-11-26   NaN   NaN 
2015-11-27   NaN   NaN 
2015-11-28   NaN   NaN 
2015-11-29   NaN   NaN 
2015-11-30   NaN   NaN 
2015-12-01 (3, 10.0, 0) (3, 10.0, 0) 
2015-12-02 (3, 10.0, 0) (3, 10.0, 0) 
2015-12-03 (3, 10.0, 0) (3, 10.0, 0) 
2015-12-04 (3, 10.0, 0) (3, 10.0, 0) 
2015-12-05 (3, 10.0, 0) (3, 10.0, 0) 
2015-12-06 (3, 10.0, 0) (3, 10.0, 0) 

をに変換する必要があります。

2015-11-15   NaN   NaN 
2015-11-22   NaN   NaN 
2015-11-29   (3, 10.0, 0) (3, 10.0, 0) 

しかし、この方法は、収量を提案:

  3046920017503 3046920017541 
index         
2015-12-05 (3, 10.0, 0) (3, 10.0, 0) 
2015-12-12 (3, 10.0, 0) (3, 10.0, 0) 

答えて

2

が、これは私のデータフレームdf

であると仮定すると、
     One   Two 
Date         
2015-11-15 (3, 10.0, 0)   NaN 
2015-11-16   NaN   NaN 
2015-11-17   NaN   NaN 
2015-11-18 (3, 10.0, 0)   NaN 
2015-11-19 (3, 10.0, 0)   NaN 
2015-11-20 (4, 8.2, 0)   NaN 
2015-11-21 (4, 8.2, 0)   NaN 
2015-11-22 (4, 8.2, 0) (1, 1.4, 1) 
2015-11-23 (3, 18.0, 1) (3, 10.0, 0) 
2015-11-26 (4, 8.2, 0) (1, 1.4, 1) 
2015-11-27 (4, 8.2, 0) (3, 10.0, 0) 
2015-11-28   NaN (1, 1.4, 1) 
2015-11-29 (4, 8.2, 0) (3, 10.0, 0) 
2015-11-30 (4, 8.2, 0) (1, 1.4, 1) 

# 'W-Sat' tells pandas to end weeks on Saturday. 
df.stack().groupby(
    [pd.Grouper(level=0, freq='W-Sat'), pd.Grouper(level=1)] 
).apply(lambda s: s.value_counts().idxmax()).unstack() 

        One   Two 
Date         
2015-11-21 (3, 10.0, 0)   None 
2015-11-28 (4, 8.2, 0) (1, 1.4, 1) 
2015-12-05 (4, 8.2, 0) (3, 10.0, 0) 

これを行ったのはもう一つの方法は、まずそれをスタックして操作することであろうレベルは、あなたがまたがるnp.nanを持っている場合に

ds = df.stack() 
g1 = (ds.index.get_level_values(0) - ds.index.levels[0].min()).days // 7 
g2 = ds.index.get_level_values(1) 
ds.groupby([g1, g2]).apply(lambda s: s.value_counts().idxmax()).unstack() 

      One   Two 
0 (3, 10.0, 0)   None 
1 (4, 8.2, 0) (1, 1.4, 1) 
2 (4, 8.2, 0) (3, 10.0, 0) 

値一週間中、np.nanを返信したい場合は、 stackないdropnaにし、それらのnp.nan

def value_counts_idxmax(s): 
    try: 
     return s.value_counts().idxmax() 
    except ValueError: 
     return np.nan 

df.stack(dropna=False).groupby(
    [pd.Grouper(level=0, freq='W-Sat'), pd.Grouper(level=1)] 
).apply(value_counts_idxmax).unstack() 


      3046920017503 3046920017541 
index         
2015-11-21   NaN   NaN 
2015-11-28   NaN   NaN 
2015-12-05 (3, 10.0, 0) (3, 10.0, 0) 
2015-12-12 (3, 10.0, 0) (3, 10.0, 0) 

それとも偉大な、多くの感謝を見える第二の方法

ds = df.stack(dropna=False) 
g1 = (ds.index.get_level_values(0) - ds.index.levels[0].min()).days // 7 
g2 = ds.index.get_level_values(1) 
ds.groupby([g1, g2]).apply(value_counts_idxmax).unstack() 

    3046920017503 3046920017541 
0   NaN   NaN 
1   NaN   NaN 
2 (3, 10.0, 0) (3, 10.0, 0) 
3 (3, 10.0, 0) (3, 10.0, 0) 
+0

とを扱うことができるapplyに関数を渡します。なぜあなたの出力データフレームに最後の2行があるのでしょうか?私の考えでは、出力テーブルのインデックスは、最も頻繁に発生する週の最初の日を表す必要があります。 – splinter

+0

正確に私が探していたもの、特に週のカスタム選択曜日に終了することを許可するための改正で。 – splinter

+0

私はいくつかの週数の間、すべての日数のデータを持つruplesとnansだけで構成されるデータフレームでメソッドを使用しています。しかし、出力データの週数は少なくなります。なぜこれができるのか? – splinter

関連する問題