मेरे पास मिश्रित 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
FChm 18 जुलाई 2019, 22:30

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]
1
BENY 18 जुलाई 2019, 22:46