2015-03-04 29 views
7

मैं User_IDs DATETIME, वस्तुओं और अन्य जानकारी के साथ एक DataFrame पर काम कर रहा है, तो निम्न निकालने की तरह होने के बाद ही यह सच मान रखें:पांडा - GroupBy एक DataFrame

User_ID;Latitude;Longitude;Datetime 
222583401;41.4020375;2.1478710;2014-07-06 20:49:20 
287280509;41.3671346;2.0793115;2013-01-30 09:25:47 
329757763;41.5453577;2.1175164;2012-09-25 08:40:59 
189757330;41.5844998;2.5621569;2013-10-01 11:55:20 
624921653;41.5931846;2.3030671;2013-07-09 20:12:20 
414673119;41.5550136;2.0965829;2014-02-24 20:15:30 
414673119;41.5550136;2.0975829;2014-02-24 20:16:30 
414673119;41.5550136;2.0985829;2014-02-24 20:17:30 

मैं के साथ उपयोगकर्ता वर्गीकृत किया गया है:

g = df.groupby(['User_ID','Datetime']) 

और उसके बाद कोई एकल datatime वस्तुओं के लिए जाँच:

df = df.groupby('User_ID')['Datetime'].apply(lambda g: len(g)>1) 

मैं निम्नलिखित ख प्राप्त कर लिया है ओलियन डेटाफ्रेम:

User_ID 
189757330 False 
222583401 False 
287280509 False 
329757763 False 
414673119  True 
624921653 False 
Name: Datetime, dtype: bool 

जो मेरे उद्देश्यों के लिए केवल सही है, केवल True_asked मान के साथ User_ID को रखने के लिए ठीक है। अब मैं केवल सही मानों से जुड़े User_ID मानों को रखना चाहता हूं, और उदाहरण के लिए उन्हें pandas.to_csv के साथ एक नए डेटाफ्रेम पर लिखें। उम्मीद DataFrame एक से अधिक समयदिनाँक वस्तु के साथ ही user_id होते हैं:

User_ID;Latitude;Longitude;Datetime 
414673119;41.5550136;2.0965829;2014-02-24 20:15:30 
414673119;41.5550136;2.0975829;2014-02-24 20:16:30 
414673119;41.5550136;2.0985829;2014-02-24 20:17:30 

कैसे मैं हर user_id के लिए बूलियन मूल्यों की पहुँच हो सकती? आपकी तरह की मदद के लिए धन्यवाद।

उत्तर

7

एक चर के लिए df.groupby('User_ID')['Datetime'].apply(lambda g: len(g)>1) का परिणाम सौंपें ताकि आप बूलियन अनुक्रमण प्रदर्शन कर सकते हैं और फिर isin फोन और फ़िल्टर कर अपने मूल df को यह से सूचकांक का उपयोग करें:

In [366]: 

users = df.groupby('User_ID')['Datetime'].apply(lambda g: len(g)>1) 
users 

Out[366]: 
User_ID 
189757330 False 
222583401 False 
287280509 False 
329757763 False 
414673119  True 
624921653 False 
Name: Datetime, dtype: bool 

In [367]: 
users[users] 

Out[367]: 
User_ID 
414673119 True 
Name: Datetime, dtype: bool 

In [368]: 
users[users].index 

Out[368]: 
Int64Index([414673119], dtype='int64') 

In [361]: 
df[df['User_ID'].isin(users[users].index)] 

Out[361]: 
    User_ID Latitude Longitude   Datetime 
5 414673119 41.555014 2.096583 2014-02-24 20:15:30 
6 414673119 41.555014 2.097583 2014-02-24 20:16:30 
7 414673119 41.555014 2.098583 2014-02-24 20:17:30 

फिर आप के रूप में ऊपर पर to_csv कॉल कर सकते हैं तो

df = df.drop_duplicates() 

, वें यह पता लगाने: सामान्य

+0

वाह! धन्यवाद! मास्किंग करने के लिए मैं परिवर्तनीय असाइनमेंट खो रहा था, धन्यवाद! –

1

पहले, सुनिश्चित करें कि आप कोई डुप्लिकेट प्रविष्टियों कर प्रत्येक के लिए ई मायने रखता है:

counts = df.groupby('User_ID').Datetime.count() 

अंत में, यह पता लगाने जहां अनुक्रमित ओवरलैप:

df[df.User_ID.isin(counts[counts > 1].index)] 
संबंधित मुद्दे