2016-05-05 21 views
3

内補間:パンダは、私は、以下の情報を持つデータフレームを持っているGROUPBY

filename val1 val2 
t     
1 file1.csv 5  10 
2 file1.csv NaN  NaN 
3 file1.csv 15  20 
6 file2.csv NaN  NaN 
7 file2.csv 10  20 
8 file2.csv 12  15 

私はインデックス、だけ各ファイルグループ内に基づいてデータフレームの値を補間したいと思います。補間する

、私は通常、

df = df.interpolate(method="index") 

をするでしょうし、そのグループに、私は

grouped = df.groupby("filename") 

を行い、私はこのように補間データフレームをしたいと思います:

filename val1 val2 
t     
1 file1.csv 5  10 
2 file1.csv 10  15 
3 file1.csv 15  20 
6 file2.csv NaN  NaN 
7 file2.csv 10  20 
8 file2.csv 12  15 

NaNは、file2グループの最初の項目であるため、t = 6にまだ存在しています。

私は、「適用」を使用する必要が疑われるが、任意の助けをいただければ幸いです正確にどのよう...

grouped.apply(interp1d) 
... 
TypeError: __init__() takes at least 3 arguments (2 given) 

把握することができていません。

答えて

4
>>> df.groupby('filename').apply(lambda group: group.interpolate(method='index')) 
    filename val1 val2 
t      
1 file1.csv  5 10 
2 file1.csv 10 15 
3 file1.csv 15 20 
6 file2.csv NaN NaN 
7 file2.csv 10 20 
8 file2.csv 12 15 
+0

これは小さなデータフレームで動作するようですが、大規模なものでは* long *時間がかかります(.interpolate()を使用した場合よりも長い時間がかかります)。効率がそれほど悪くなると思いますか?グループの数は、行の数の数(10^7行に比べて約1000のグループ)に比べて小さいです。 –

0

これも同様です。

import numpy as np 
import pandas as pd 

np.random.seed(500) 
test_df = pd.DataFrame({ 
    'a': np.random.randint(low=0, high=1000, size=10000), 
    'b': np.random.choice([1, 2, 4, 7, np.nan], size=10000, p=([0.2475]*4 + [0.01])) 
}) 

テスト:

%timeit test_df.groupby('a').transform(pd.DataFrame.interpolate) 

出力:566 ms ± 27.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)代わりapplyを使用しての、あなたは1000のグループのために持っている場合は25%以上で、あなたの実行時間を短縮れる、transformを使用することができます

%timeit test_df.groupby('a').apply(pd.DataFrame.interpolate) 

出力:788 ms ± 10.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit test_df.groupby('a').apply(lambda group: group.interpolate()) 

出力:787 ms ± 17.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit test_df.interpolate() 

出力:918 µs ± 16.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

あなたはまだ完全なデータフレーム上のinterpolateに完全にベクトル化されたコールに比べて実行時間が大幅に増加が表示されますが、私はしないでくださいあなたはパンダでもっとうまくやれると思います。

関連する問題