2016-09-12 3 views
7

या तो मुझे documentation समझ में नहीं आता है या यह पुराना है।पुन: नमूना कॉल करने के बाद मूल्य 0 के साथ fillna() कैसे करें?

अगर मैं

user[["DOC_ACC_DT", "USER_SIGNON_ID"]].groupby("DOC_ACC_DT").agg(["count"]).resample("1D").fillna(value=0, method="ffill") 

चलाने यह

TypeError: fillna() got an unexpected keyword argument 'value' 

मिल मैं सिर्फ

.fillna(0) 

चलाते हैं मैं

ValueError: Invalid fill method. Expecting pad (ffill), backfill (bfill) or nearest. Got 0 

अगर मैं तो

.fillna(0, method="ffill") 

सेट मैं

TypeError: fillna() got multiple values for keyword argument 'method' 

तो केवल बात यह है कि काम करता है

.fillna("ffill") 

है लेकिन निश्चित रूप कि सिर्फ एक आगे भरने बनाता है। हालांकि, मैं शून्य के साथ NaN को प्रतिस्थापित करना चाहता हूं। मुझसे यहां क्या गलत हो रहा है?

+0

@AmiTavory यह मुझे "* ValueError: अवैध भरने की विधि देता है। पैड (एफएफआईएल), बैकफिल (बीएफआईएल) या नजदीक की अपेक्षा। गॉट वैल्यू = '0', विधि = 'ffill'" * के लिए .fillna ("value = '0', विधि = 'ffill' ")' – displayname

+0

यहां उदाहरण हैं। http://pandas.pydata.org/pandas-docs/stable/missing_data.html#filling-missing-values-fillna –

+2

मुझे कुछ दिन पहले भी यही समस्या थी। ऐसा लगता है कि 'resample()। Fillna()' केवल विधि कीवर्ड के साथ काम करता है। आप स्थिर नहीं पारित कर सकते हैं। सुनिश्चित नहीं है कि यह एक बग है या इस तरह से डिजाइन किया गया है। दस्तावेज़ों का सही लिंक होना चाहिए [यह] (http://pandas.pydata.org/pandas-docs/version/0.18.0/generated/pandas.tseries.resample.Resampler.fillna.html) मुझे लगता है कि यह एक है अलग विधि – ayhan

उत्तर

5

ठीक है, मैं क्यों कोड ऊपर काम नहीं कर रहा है और मैं किसी के लिए प्रतीक्षा करने के लिए इस तुलना में एक बेहतर जवाब देने के लिए जा रहा हूँ नहीं मिलता है, लेकिन मैं सिर्फ

.replace(np.nan, 0) 

पाया मैं होता क्या करता है .fillna(0) से अपेक्षित।

+0

परिणामी प्रकार के' resample' को परिवर्तित करने के बावजूद, यह ऐसा लगता है जाने के लिए रास्ता। –

1

केवल वैकल्पिक हल fillna का उपयोग कर के पास सीधे .head(len(df.index)) प्रदर्शन के बाद यह कॉल करने के लिए किया जाएगा।

मैं इस मामले में उपयोगी होने के लिए DF.head मान रहा हूं मुख्य रूप से क्योंकि जब समूह के ऑब्जेक्ट पर पुन: नमूना फ़ंक्शन लागू होता है, तो यह इनपुट पर फ़िल्टर के रूप में कार्य करेगा, समूहों के उन्मूलन के कारण मूल के कम आकार को वापस कर देगा।

कॉलिंग DF.head() इस परिवर्तन से प्रभावित नहीं होता है और पूरे DF देता है।

डेमो:

np.random.seed(42) 

df = pd.DataFrame(np.random.randn(10, 2), 
       index=pd.date_range('1/1/2016', freq='10D', periods=10), 
       columns=['A', 'B']).reset_index() 

df 
     index   A   B 
0 2016-01-01 0.496714 -0.138264 
1 2016-01-11 0.647689 1.523030 
2 2016-01-21 -0.234153 -0.234137 
3 2016-01-31 1.579213 0.767435 
4 2016-02-10 -0.469474 0.542560 
5 2016-02-20 -0.463418 -0.465730 
6 2016-03-01 0.241962 -1.913280 
7 2016-03-11 -1.724918 -0.562288 
8 2016-03-21 -1.012831 0.314247 
9 2016-03-31 -0.908024 -1.412304 

संचालन:

resampled_group = df[['index', 'A']].groupby(['index'])['A'].agg('count').resample('2D') 
resampled_group.head(len(resampled_group.index)).fillna(0).head(20) 

index 
2016-01-01 1.0 
2016-01-03 0.0 
2016-01-05 0.0 
2016-01-07 0.0 
2016-01-09 0.0 
2016-01-11 1.0 
2016-01-13 0.0 
2016-01-15 0.0 
2016-01-17 0.0 
2016-01-19 0.0 
2016-01-21 1.0 
2016-01-23 0.0 
2016-01-25 0.0 
2016-01-27 0.0 
2016-01-29 0.0 
2016-01-31 1.0 
2016-02-02 0.0 
2016-02-04 0.0 
2016-02-06 0.0 
2016-02-08 0.0 
Freq: 2D, Name: A, dtype: float64 
1

मैं कुछ परीक्षण करना और यह बहुत दिलचस्प है।

नमूना:

import pandas as pd 
import numpy as np 

np.random.seed(1) 
rng = pd.date_range('1/1/2012', periods=20, freq='S') 
df = pd.DataFrame({'a':['a'] * 10 + ['b'] * 10, 
        'b':np.random.randint(0, 500, len(rng))}, index=rng) 
df.b.iloc[3:8] = np.nan 
print (df) 
        a  b 
2012-01-01 00:00:00 a 37.0 
2012-01-01 00:00:01 a 235.0 
2012-01-01 00:00:02 a 396.0 
2012-01-01 00:00:03 a NaN 
2012-01-01 00:00:04 a NaN 
2012-01-01 00:00:05 a NaN 
2012-01-01 00:00:06 a NaN 
2012-01-01 00:00:07 a NaN 
2012-01-01 00:00:08 a 335.0 
2012-01-01 00:00:09 a 448.0 
2012-01-01 00:00:10 b 144.0 
2012-01-01 00:00:11 b 129.0 
2012-01-01 00:00:12 b 460.0 
2012-01-01 00:00:13 b 71.0 
2012-01-01 00:00:14 b 237.0 
2012-01-01 00:00:15 b 390.0 
2012-01-01 00:00:16 b 281.0 
2012-01-01 00:00:17 b 178.0 
2012-01-01 00:00:18 b 276.0 
2012-01-01 00:00:19 b 254.0 

downsampling:

Resampler.asfreq साथ

संभव समाधान:

print (df.groupby('a').resample('2S').first()) 
         a  b 
a        
a 2012-01-01 00:00:00 a 37.0 
    2012-01-01 00:00:02 a 396.0 
    2012-01-01 00:00:04 a NaN 
    2012-01-01 00:00:06 a NaN 
    2012-01-01 00:00:08 a 335.0 
b 2012-01-01 00:00:10 b 144.0 
    2012-01-01 00:00:12 b 460.0 
    2012-01-01 00:00:14 b 237.0 
    2012-01-01 00:00:16 b 281.0 
    2012-01-01 00:00:18 b 276.0 
:

हैं उपयोग asfreq, व्यवहार first द्वारा एक ही एकत्र कर रहा है

print (df.groupby('a').resample('2S').first().fillna(0)) 
         a  b 
a        
a 2012-01-01 00:00:00 a 37.0 
    2012-01-01 00:00:02 a 396.0 
    2012-01-01 00:00:04 a 0.0 
    2012-01-01 00:00:06 a 0.0 
    2012-01-01 00:00:08 a 335.0 
b 2012-01-01 00:00:10 b 144.0 
    2012-01-01 00:00:12 b 460.0 
    2012-01-01 00:00:14 b 237.0 
    2012-01-01 00:00:16 b 281.0 
    2012-01-01 00:00:18 b 276.0 

print (df.groupby('a').resample('2S').asfreq().fillna(0)) 
         a  b 
a        
a 2012-01-01 00:00:00 a 37.0 
    2012-01-01 00:00:02 a 396.0 
    2012-01-01 00:00:04 a 0.0 
    2012-01-01 00:00:06 a 0.0 
    2012-01-01 00:00:08 a 335.0 
b 2012-01-01 00:00:10 b 144.0 
    2012-01-01 00:00:12 b 460.0 
    2012-01-01 00:00:14 b 237.0 
    2012-01-01 00:00:16 b 281.0 
    2012-01-01 00:00:18 b 276.0 

उपयोग replace एक और मूल्यों mean के रूप में एकत्रित कर रहे हैं:

print (df.groupby('a').resample('2S').mean()) 
          b 
a       
a 2012-01-01 00:00:00 136.0 
    2012-01-01 00:00:02 396.0 
    2012-01-01 00:00:04 NaN 
    2012-01-01 00:00:06 NaN 
    2012-01-01 00:00:08 391.5 
b 2012-01-01 00:00:10 136.5 
    2012-01-01 00:00:12 265.5 
    2012-01-01 00:00:14 313.5 
    2012-01-01 00:00:16 229.5 
    2012-01-01 00:00:18 265.0 
print (df.groupby('a').resample('2S').mean().fillna(0)) 
          b 
a       
a 2012-01-01 00:00:00 136.0 
    2012-01-01 00:00:02 396.0 
    2012-01-01 00:00:04 0.0 
    2012-01-01 00:00:06 0.0 
    2012-01-01 00:00:08 391.5 
b 2012-01-01 00:00:10 136.5 
    2012-01-01 00:00:12 265.5 
    2012-01-01 00:00:14 313.5 
    2012-01-01 00:00:16 229.5 
    2012-01-01 00:00:18 265.0 

print (df.groupby('a').resample('2S').replace(np.nan,0)) 
          b 
a       
a 2012-01-01 00:00:00 136.0 
    2012-01-01 00:00:02 396.0 
    2012-01-01 00:00:04 0.0 
    2012-01-01 00:00:06 0.0 
    2012-01-01 00:00:08 391.5 
b 2012-01-01 00:00:10 136.5 
    2012-01-01 00:00:12 265.5 
    2012-01-01 00:00:14 313.5 
    2012-01-01 00:00:16 229.5 
    2012-01-01 00:00:18 265.0 

Upsampling:

उपयोग asfreq, यह है एक ही replace के रूप में:

print (df.groupby('a').resample('200L').asfreq().fillna(0)) 
          a  b 
a         
a 2012-01-01 00:00:00.000 a 37.0 
    2012-01-01 00:00:00.200 0 0.0 
    2012-01-01 00:00:00.400 0 0.0 
    2012-01-01 00:00:00.600 0 0.0 
    2012-01-01 00:00:00.800 0 0.0 
    2012-01-01 00:00:01.000 a 235.0 
    2012-01-01 00:00:01.200 0 0.0 
    2012-01-01 00:00:01.400 0 0.0 
    2012-01-01 00:00:01.600 0 0.0 
    2012-01-01 00:00:01.800 0 0.0 
    2012-01-01 00:00:02.000 a 396.0 
    2012-01-01 00:00:02.200 0 0.0 
    2012-01-01 00:00:02.400 0 0.0 
    ... 

print (df.groupby('a').resample('200L').replace(np.nan,0)) 
           b 
a        
a 2012-01-01 00:00:00.000 37.0 
    2012-01-01 00:00:00.200 0.0 
    2012-01-01 00:00:00.400 0.0 
    2012-01-01 00:00:00.600 0.0 
    2012-01-01 00:00:00.800 0.0 
    2012-01-01 00:00:01.000 235.0 
    2012-01-01 00:00:01.200 0.0 
    2012-01-01 00:00:01.400 0.0 
    2012-01-01 00:00:01.600 0.0 
    2012-01-01 00:00:01.800 0.0 
    2012-01-01 00:00:02.000 396.0 
    2012-01-01 00:00:02.200 0.0 
    2012-01-01 00:00:02.400 0.0 
    ... 
print ((df.groupby('a').resample('200L').replace(np.nan,0).b == 
     df.groupby('a').resample('200L').asfreq().fillna(0).b).all()) 
True 

निष्कर्ष:

sum, first या mean की तरह और upsampling asfreq के लिए downsampling उपयोग एक ही योग के समारोह के लिए।

+0

बहुत अच्छा शोध! – MaxU

+0

@MaxU - धन्यवाद। – jezrael

संबंधित मुद्दे