2017-07-07 13 views
9

मैं एक डेटा फ्रेम कि निम्नलिखितसमूह के भीतर लापता तिथियाँ और मूल्यों भरने पांडा

x = pd.DataFrame({'user': ['a','a','b','b'], 'dt': ['2016-01-01','2016-01-02', '2016-01-05','2016-01-06'], 'val': [1,33,2,1]}) 

तरह लग रहा है मैं ऐसा करने में सक्षम होना चाहते हैं क्या है तारीख स्तंभ के भीतर न्यूनतम और अधिकतम तारीख खोजने और val कॉलम के लिए 0 में भरने के साथ-साथ उस कॉलम का विस्तार करने के लिए उस कॉलम का विस्तार करें। तो वांछित आउटपुट

  dt user val 
0 2016-01-01 a 1 
1 2016-01-02 a 33 
2 2016-01-03 a 0 
3 2016-01-04 a 0 
4 2016-01-05 a 0 
5 2016-01-06 a 0 
6 2016-01-01 b 0 
7 2016-01-02 b 0 
8 2016-01-03 b 0 
9 2016-01-04 b 0 
10 2016-01-05 b 2 
11 2016-01-06 b 1 

मैं कोशिश की है समाधान उल्लेख here और here है, लेकिन वे नहीं कर रहे हैं कि मैं क्या करने के बाद कर रहा हूँ। किसी भी पॉइंटर्स की बहुत सराहना की।

उत्तर

8

प्रारंभिक Dataframe:

dt user val 
0 2016-01-01 a 1 
1 2016-01-02 a 33 
2 2016-01-05 b 2 
3 2016-01-06 b 1 

पहले, दिनांक को दिनांक परिवर्तित:

x['dt'] = pd.to_datetime(x['dt']) 

फिर, दिनांक और अद्वितीय उपयोगकर्ताओं उत्पन्न:

dates = x.set_index('dt').resample('D').asfreq().index 

>> DatetimeIndex(['2016-01-01', '2016-01-02', '2016-01-03', '2016-01-04', 
       '2016-01-05', '2016-01-06'], 
       dtype='datetime64[ns]', name='dt', freq='D') 

users = x['user'].unique() 

>> array(['a', 'b'], dtype=object) 

यह करने के लिए आप की अनुमति देगा मल्टीइंडेक्स बनाएं:

idx = pd.MultiIndex.from_product((dates, users), names=['dt', 'user']) 

>> MultiIndex(levels=[[2016-01-01 00:00:00, 2016-01-02 00:00:00, 2016-01-03 00:00:00, 2016-01-04 00:00:00, 2016-01-05 00:00:00, 2016-01-06 00:00:00], ['a', 'b']], 
      labels=[[0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5], [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]], 
      names=['dt', 'user']) 

आपको लगता है कि उपयोग कर सकते हैं अपने DataFrame पुन: अनुक्रमणिका के लिए:

x.set_index(['dt', 'user']).reindex(idx, fill_value=0).reset_index() 
Out: 
      dt user val 
0 2016-01-01 a 1 
1 2016-01-01 b 0 
2 2016-01-02 a 33 
3 2016-01-02 b 0 
4 2016-01-03 a 0 
5 2016-01-03 b 0 
6 2016-01-04 a 0 
7 2016-01-04 b 0 
8 2016-01-05 a 0 
9 2016-01-05 b 2 
10 2016-01-06 a 0 
11 2016-01-06 b 1 

तो उन के अनुसार क्रमबद्ध किया जा सकता है:

x.set_index(['dt', 'user']).reindex(idx, fill_value=0).reset_index().sort_values(by='user') 
Out: 
      dt user val 
0 2016-01-01 a 1 
2 2016-01-02 a 33 
4 2016-01-03 a 0 
6 2016-01-04 a 0 
8 2016-01-05 a 0 
10 2016-01-06 a 0 
1 2016-01-01 b 0 
3 2016-01-02 b 0 
5 2016-01-03 b 0 
7 2016-01-04 b 0 
9 2016-01-05 b 2 
11 2016-01-06 b 1 
+0

यह काम करता है। धन्यवाद। – broccoli

3

@ayhan के रूप में पता चलता है

x.dt = pd.to_datetime(x.dt) 

एक-लाइनर stack/unstack और 01 को शामिल करते समय ज्यादातर @ आयन के विचारों का उपयोग करते हुए

x.set_index(
    ['dt', 'user'] 
).unstack(
    fill_value=0 
).asfreq(
    'D', fill_value=0 
).stack().sort_index(level=1).reset_index() 

      dt user val 
0 2016-01-01 a 1 
1 2016-01-02 a 33 
2 2016-01-03 a 0 
3 2016-01-04 a 0 
4 2016-01-05 a 0 
5 2016-01-06 a 0 
6 2016-01-01 b 0 
7 2016-01-02 b 0 
8 2016-01-03 b 0 
9 2016-01-04 b 0 
10 2016-01-05 b 2 
11 2016-01-06 b 1 
संबंधित मुद्दे