2017-02-11 8 views
3

groupby要素に 'bfill'または 'ffill'を使用するのは簡単ですが、2番目の列の特定の値でnaを満たす必要がある場合はどうしますか? 3列目の状態ですか?例えば(パンダ)groupbyとカラムの条件に基づいてNaNを記入してください

は:

>>> df=pd.DataFrame({'date':['01/10/2017', '02/09/2017', '02/10/2016','01/10/2017', '01/11/2017', '02/10/2016'], 'a':[1,1,1,2,2,2], 'b':[4,np.nan,6, 5, np.nan, 7]}) 
>>> df 
    a b  date 
0 1 4.0 01/10/2017 
1 1 NaN 02/09/2017 
2 1 6.0 02/10/2016 
3 2 5.0 01/10/2017 
4 2 NaN 01/11/2017 
5 2 7.0 02/10/2016 

I「」はカラムによってグループ必要があり、その行の日付がNaN列の日付に最も近い列「B」値とはNaNを埋めます。

ので、出力は次のようになります。

a b  date 
0 1 4.0 01/10/2017 
1 1 6.0 02/09/2017 
2 1 6.0 02/10/2016 
3 2 5.0 01/10/2017 
4 2 5.0 01/11/2017 
5 2 7.0 02/10/2016 

のNaN日と、そのグループ内の他の日付のリストを受け取り、最も近い日付を返しますclosest_date()関数があるとします。

私は、行を反復処理する必要のない、ラムダでapply()を使用できる理想的なクリーンなソリューションを探しています。何か案は?

+0

あなたのデータを持った後、誤っているようです。グループの場合は '1'あなたは6' '選択した==は' nan'に記入します。しかし、「01/10/2017」は「02/09/2017」に近く、「4」は塗りつぶし値であったはずであることが示唆される。 – piRSquared

答えて

0

これは動作するはずです:機能(closest_date())を考えると

df['closest_date_by_a'] = df.groupby('a')['date'].apply(closest_date) 
df['b'] = df.groupby(['a', 'closest_date_by_a'])['b'].ffill().bfill() 

を、あなたはそれが各グループ内の行のために最も近い日数を計算してグループによってその機能を適用する必要があります。その後、グループがメイングループ化列(a)と最も近い日付の列(closest_date_by_a)の両方で、あなたの充填を行うことができます。

0

dateの列が実際に日付であることを確認してください。

df = pd.DataFrame(
    {'date': ['01/10/2017', '02/09/2017', '02/10/2016','01/10/2017', '01/11/2017', '02/10/2016'], 
    'a':[1,1,1,2,2,2], 'b':[4,np.nan,6, 5, np.nan, 7]}) 
df.date = pd.to_datetime(df.date) 

print(df) 

    a b  date 
0 1 4.0 2017-01-10 
1 1 NaN 2017-02-09 
2 1 6.0 2016-02-10 
3 2 5.0 2017-01-10 
4 2 NaN 2017-01-11 
5 2 7.0 2016-02-10 

method='nearest'で使用reindexdropna()

def fill_with_nearest(df): 
    s = df.set_index('date').b 
    s = s.dropna().reindex(s.index, method='nearest') 
    s.index = df.index 
    return s 

df.loc[df.b.isnull(), 'b'] = df.groupby('a').apply(fill_with_nearest).reset_index(0, drop=True) 

print(df) 

    a b  date 
0 1 4.0 2017-01-10 
1 1 4.0 2017-02-09 
2 1 6.0 2016-02-10 
3 2 5.0 2017-01-10 
4 2 5.0 2017-01-11 
5 2 7.0 2016-02-10 
+0

答えをありがとう。私はそれはかなりきちんとだ、「最も近い」fillメソッドについては知りませんでした。 私のデータでこのメソッドを試していますが、いくつかの繰り返しでエラーが発生します: 'ValueError:メソッドまたはリミットで一意でないインデックスを再インデックスできません。 ' 何が原因でしょうか?私は同じ '日付'の値を持つ新しい行を追加することで、この例のエラーを再現しようとしましたが、それでも問題なく動作します。 – yobogoya

関連する問題