मेरे पिछले प्रश्नों में से एक में मुझे दिया गया है कार्य के लिए विभिन्न समाधान जिससे मुझे बहुत मदद मिली। अब मुझे एक अलग तरह की समस्या का सामना करना पड़ा जिसमें अवधियों के बीच रिक्त स्थान की गिनती और कई शर्तों के आधार पर प्रारंभ और प्रारंभ तिथियां शामिल हैं।

उदाहरण:

इनपुट

enter image description here

तिथियों के बीच अंतराल को ध्यान में रखते हुए, मुझे प्रारंभ और समाप्ति तिथियों को विशेषता देने की आवश्यकता है। ऐसा कुछ पाने के लिए:

आउटपुट

enter image description here

तिथियों को जिम्मेदार ठहराने में निम्नलिखित शर्तों पर विचार किया गया था:

  1. यदि अवधि के बीच का अंतर (रिक्त स्थान की संख्या) बराबर या कम 2 है, तो अवधि को निरंतर माना जाता है (उदाहरण आईडी 3000)। इस मामले में, आरंभ और समाप्ति तिथियां डेटा के साथ पहली और अंतिम तिथि होती हैं।

  2. यदि अंतराल> 2 है, तो 2 या अधिक अवधियों (3 से अधिक हो सकता है) को विशेषता देने की आवश्यकता है, इस तरह से प्रत्येक गुट को इसकी शुरुआत और समाप्ति तिथियां मिलती हैं, और यदि अंतिम कॉलम में डेटा है , तो अंतिम तिथि अनंत है।

  3. इसके अलावा मुझे परिभाषित प्रत्येक अंश में औसत की गणना करने की आवश्यकता है।

इसे करने का सबसे आसान तरीका क्या है?

एक उदाहरण डेटासेट की सुविधा के लिए:

import pandas as pd
data = pd.DataFrame({'id':[1000,2000,3000,4000],
               '201710':[7585,  4110,   4498,   np.nan],
               '201711':[7370,  3877,   4850,   4309],
               '201712':[6505,    np.nan,   4546,   4498],
               '201801':[7473,    np.nan,     np.nan,   4850],
               '201802':[6183,    np.nan,     np.nan,   np.nan ],
               '201803':[6699,  4558,   1429,   np.nan ],
               '201804':[ 118,  4152,   1429,   np.nan ],
               '201805':[  np.nan,  4271,   1960,   np.nan ],
               '201806':[  np.nan,    np.nan,   1798,   np.nan ],
               '201807':[  np.nan,    np.nan,   1612,   4361],
               '201808':[  np.nan,    np.nan,   1612,   4272],
               '201809':[  np.nan,  3900,   1681,   4199]                 
               })

मैंने NAN की गणना के लिए जो किया है वह निम्नलिखित है:

res = pd.melt(df, id_vars=['id'], value_vars=df.columns[1:])
res.sort_values(by=['id', 'variable'], ascending=[True, True], inplace=True)
res=res.replace(np.nan, 0) 
m = res.value.diff().ne(0).cumsum().rename('gid') 
df1 = res.groupby(['id', m]).value.value_counts().loc[:,:,0].droplevel(-1)

यह समाधान मैंने यहां पाया और इसे पसंद किया . हालाँकि, मैं अगले चरणों में फंस गया हूँ ..

परिणामस्वरूप मुझे इस तरह का एक डेटाफ्रेम मिला, जहां start_date पहली अशक्त घटना है, end_date - अंतिम अशक्त घटना और 1-2-3 रिक्त स्थान आगे के विश्लेषण के लिए रिक्त स्थान के साथ भिन्न हैं: यहां छवि विवरण दर्ज करें

आप इसे स्क्रिप्ट के माध्यम से प्राप्त कर सकते हैं

df = pd.DataFrame({'id':[1000,2000,3000,4000],
               '201710':[7585,  4110,   4498,   np.nan],
               '201711':[7370,  3877,   4850,   4309],
               '201712':[6505,    np.nan,   4546,   4498],
               '201801':[7473,    np.nan,     np.nan,   4850],
               '201802':[6183,    np.nan,     np.nan,   np.nan ],
               '201803':[6699,  4558,   1429,   np.nan ],
               '201804':[ 118,  4152,   1429,   np.nan ],
               '201805':[  np.nan,  4271,   1960,   np.nan ],
               '201806':[  np.nan,    np.nan,   1798,   np.nan ],
               '201807':[  np.nan,    np.nan,   1612,   4361],
               '201808':[  np.nan,    np.nan,   1612,   4272],
               '201809':[  np.nan,  3900,   1681,   4199] ,
               'start_date':[201710, 201710, 201710,201711],
               'end_date':[201804,201809, 201809,201809],
               '1st_blank':[5, 3,2,5],
               '2nd_blank':[np.nan, 3, np.nan, np.nan]
               })

अब, मुझे प्रत्येक अंश की शुरुआत और समाप्ति तिथियां प्राप्त करने की आवश्यकता है:

enter image description here

1
Vero 11 सितंबर 2020, 12:28

1 उत्तर

सबसे बढ़िया उत्तर

मेरे पास पर्याप्त समय नहीं है।तो यह एक विचार है

df.set_index("id", inplace=True)
gap = 2
df.fillna("X", inplace=True).astype(str)
def get_series(arr):
    s = "".join(arr)
    res = [(i[0],i[-1]) for i in s.split("X" * gap)]
    # get index of i[0] and i[-1], and get its arr.index and return
    return [index1, index2, index3, index4....]
df['multi_index'] = df.apply(get_series, axis=1)
# do split columns 'multi_index'
1
Johnny 11 सितंबर 2020, 13:47