मेरे पास एक डेटाफ्रेम है जैसा कि नीचे दिखाया गया है। यह इस post< की निरंतरता है। /ए>
df = pd.DataFrame({'person_id': [101,101,101,101,202,202,202],
'person_type':['A','A','B','C','D','B','A'],
'login_date':['5/7/2013 09:27:00 AM','09/08/2013 11:21:00 AM','06/06/2014 08:00:00 AM','06/06/2014 05:00:00 AM','12/11/2011 10:00:00 AM','13/10/2012 12:00:00 AM','13/12/2012 11:45:00 AM'],
'logout_date':[np.nan,'11/08/2013 11:21:00 AM',np.nan,'06/06/2014 05:00:00 AM',np.nan,'13/10/2012 12:00:00 AM',np.nan]})
df.login_date = pd.to_datetime(df.login_date)
df.logout_date = pd.to_datetime(df.logout_date)
मैं logout_date कॉलम में 2 नियम लागू करना चाहता हूं
नियम 1 - यदि व्यक्ति प्रकार बी, सी, डी, ई और लॉगआउट_डेट NaN है, तो लॉगिन तिथि मान की प्रतिलिपि बनाएँ
नियम 2 - यदि व्यक्ति प्रकार A है और logout_date NaN है, तो लॉगिन तिथि में 2 दिन जोड़ें
जब मैं नीचे की कोशिश करता हूँ
m1 = df['person_type'].isin(['B','C','D'])
m2 = df['person_type'].isin(['A'])
m3 = df['logout_datetime'].isna()
df['logout_datetime'] = np.select([m1 & m3, m2 & m3],
[df['login_datetime'], df['login_datetime'] + pd.DateOffset(days=2)],
default=df['logout_datetime'])
df['logout_date'] = np.select([m1 & m3, m2 & m3],
[df['login_datetime'].dt.date, (df['login_datetime'] + pd.DateOffset(days=2)).dt.date],
default=df['logout_datetime'])
मैं नमूना कोड में दिखाए गए अनुसार np.select
का उपयोग करके सीधे logout_date
कॉलम प्राप्त करना चाहता हूं।
वर्तमान में मुझे नीचे जैसा आउटपुट मिलता है जो गलत है
मुझे समझ में नहीं आता क्यों कुछ पंक्तियां समस्याएं पैदा कर रही हैं जबकि अन्य पंक्तियां ठीक काम कर रही हैं।
क्या इसमें मेरी मदद कर सकते हैं? मुझे उम्मीद है कि मेरे आउटपुट में उचित दिनांक मान होंगे
1 उत्तर
मुझे लगता है कि default
पैरामीटर में np.select
(default=df['logout_datetime']
) में कनवर्ट करने में समस्या गुम है और np.select
से लौटाए गए समान प्रकारों के लिए इसे default=df['logout_datetime'].dt.date
में बदलें:
df['logout_date'] = np.select([m1 & m3, m2 & m3],
[df['login_date'].dt.date,
(df['login_date'] + pd.DateOffset(days=2)).dt.date],
default=df['logout_date'].dt.date)
print (df)
person_id person_type login_date logout_date
0 101 A 2013-05-07 09:27:00 2013-05-09
1 101 A 2013-09-08 11:21:00 2013-11-08
2 101 B 2014-06-06 08:00:00 2014-06-06
3 101 C 2014-06-06 05:00:00 2014-06-06
4 202 D 2011-12-11 10:00:00 2011-12-11
5 202 B 2012-10-13 00:00:00 2012-10-13
6 202 A 2012-12-13 11:45:00 2012-12-15
अगर default
डेटाटाइम के साथ चाहिए तो Series.dt.normalize
निकालने का समय (00:00:00
पर सेट) और सभी प्रकार datetime
s हैं, इसलिए अच्छी तरह से काम कर रहा है:
df['logout_date'] = np.select([m1 & m3, m2 & m3],
[df['login_date'].dt.normalize(),
(df['login_date'] + pd.DateOffset(days=2)).dt.normalize()],
default=df['logout_date'])
print (df)
person_id person_type login_date logout_date
0 101 A 2013-05-07 09:27:00 2013-05-09 00:00:00
1 101 A 2013-09-08 11:21:00 2013-11-08 11:21:00
2 101 B 2014-06-06 08:00:00 2014-06-06 00:00:00
3 101 C 2014-06-06 05:00:00 2014-06-06 05:00:00
4 202 D 2011-12-11 10:00:00 2011-12-11 00:00:00
5 202 B 2012-10-13 00:00:00 2012-10-13 00:00:00
6 202 A 2012-12-13 11:45:00 2012-12-15 00:00:00
मूल डेटाटाइम उपयोग के लिए:
df['logout_date'] = np.select([m1 & m3, m2 & m3],
[df['login_date'],
(df['login_date'] + pd.DateOffset(days=2))],
default=df['logout_date'])
print (df)
person_id person_type login_date logout_date
0 101 A 2013-05-07 09:27:00 2013-05-09 09:27:00
1 101 A 2013-09-08 11:21:00 2013-11-08 11:21:00
2 101 B 2014-06-06 08:00:00 2014-06-06 08:00:00
3 101 C 2014-06-06 05:00:00 2014-06-06 05:00:00
4 202 D 2011-12-11 10:00:00 2011-12-11 10:00:00
5 202 B 2012-10-13 00:00:00 2012-10-13 00:00:00
6 202 A 2012-12-13 11:45:00 2012-12-15 11:45:00
dt.date
का उपयोग नहीं करता, इसे केवल डेटाटाइम मान से भरना चाहिए? यह एक इंटरगर से क्यों भरता है?..upvited
date
s और datetime
s . के साथ बेमेल है
df['login_date'].dt.date
वापसी की तारीखें, फिर (df['login_date'] + pd.DateOffset(days=2)).dt.date
वापसी date
s और default=df['logout_date']
वापसी की तारीखें
2014-06-06 08:00:00
को बनाए रखने के बजाय, यह इसे 2014-06-06 00:00:00
कर देता है
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।
na
हो सकता है