मेरे पास मिश्रित str/float कॉलम के साथ एक बड़ा pd.DataFrame है। मैं एक पंक्ति के 20 मिनट की खिड़की के भीतर उस पंक्ति के डुप्लिकेट की संख्या गिनना चाहता हूं।
उदाहरण के लिए:
time = [3,4,5,6,10,15,25,27,50]
a = np.ones(len(time))
b = np.zeros(len(time))
c = ['a', 'a', 'b', 'b', 'b', 'c', 'd','d','d']
df = pd.DataFrame({'time':time, 'a':a, 'b':b, 'c':c})
इससे मुझे जो परिणाम की उम्मीद है वह है:
result = [1,1,2,2,2,0,1,1,0]
जैसा कि आप देख सकते हैं, परिणाम समय के समान लंबाई है, और यह उस पंक्ति के दोनों ओर 10 'मिनट' के भीतर डुप्लिकेट की संख्या की गणना करता है। उदाहरण के लिए, जिस पंक्ति में समय = 27 में केवल एक डुप्लिकेट है, क्योंकि समय = 50 के साथ पंक्ति एक डुप्लिकेट है, यह विचार करने के लिए समय से बहुत दूर है।
परिणाम प्राप्त करने के लिए एक बहुत धीमा और बदसूरत तरीका लूप के साथ होगा और मैन्युअल रूप से एक विंडो बनाना जो चलता है:
result = []
for i, t in zip(df.index, df.time):
x = df[(df['time']>t-10) & (df['time']<t+10)]
row = df.loc[i,['a','b','c']]
res = ((x==row).sum(axis=1)==3).sum()-1
result.append(res)
मुझे बहुत तेजी से कार्यान्वयन की आवश्यकता है और एक पांडा डेटाफ्रेम की .rolling
विधि को देखा है, लेकिन इसे कई स्तंभों और str मानों के साथ काम करने के लिए नहीं मिल सकता है।
1 उत्तर
मैं केवल प्रक्रिया को तेज करने के तरीके के बारे में सोच सकता हूं
s=pd.Series(df.drop('time',1).apply(tuple,1).map(hash).values,index=df.time)
[ sum(s.loc[x-10:x+10]==y)-1 for x ,y in zip(s.index,s)]
Out[1008]: [1, 1, 2, 2, 2, 0, 1, 1, 0]
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।