मान लें कि मेरे पास निम्न डेटा फ्रेम है,

df.head()
    ID  start    end    symbol    symbol_id    type
    1   146       291      bus    bus-201  CDS
    1   146      314      bus    bus-201  trans
    1   603       243      bus    bus-201  CDS
    1   1058      2123      car    car-203  CDS
    1   910       81      car    car-203  ex
    1   2623      2686      car    car-203  CDS
    1   5948       6043      car    car-203  CDS
    1   6348       6474      car    car-203  CDS
    1   910       81      car    car-201  ex
    1   910       81      car    car-201  ex
    1   636      650      car    car-203  CDS
    1   202      790      train    train-204  CDS
    1   200      314      train    train-204  CDS
    1   202      837      train    train-204  CDS

अब उपरोक्त डेटा फ्रेम से, मुझे कॉलम symbol_id के आधार पर आइटम द्वारा समूहित करने की आवश्यकता है यदि कॉलम type CDS है। फिर, मुझे कॉलम start से पहले मान को start column of the new data frame and last value from columnendas the value in columnend` में मान के रूप में उपयोग करने की आवश्यकता है।

अंत में, df2 ऐसा दिखना चाहिए,

start    end    symbol    symbol_id    type
146     243    bus        bus-203     CDS
1058    650    car        car-203     CDS
202     837    train      train-204    CDS

मैंने df['symbol'] से मूल्यों के list का उपयोग करने का प्रयास किया है,

sym_list=df['symbol'].tolist().drop_duplicates()
    for symbol in df['symbol'].values:
        if symbol in tuple(sym_list):
           df_symbol =df['symbol'].isin(symbol)

जिसने निम्नलिखित त्रुटि फेंक दी,

TypeError: only list-like objects are allowed to be passed to isin(), you passed a [str]

मैं प्रत्येक symbol और symbol_id मान का उपयोग करके पहले और अंतिम मान को कैप्चर करने का प्रयास कर रहा था,

start = df.query('type =="CDS"')[['start']].iloc[0]    
end = df.query('type =="CDS"')[['end']].iloc[-1]  

हालांकि, मेरा डेटा फ्रेम काफी बड़ा है और मेरे पास symbol के लिए 50,000 से अधिक अद्वितीय मान हैं, इसलिए मुझे यहां एक बेहतर समाधान की आवश्यकता है।

किसी भी मदद या सुझाव की सराहना की जाती है !!

1
user1017373 1 अक्टूबर 2019, 12:52

2 जवाब

सबसे बढ़िया उत्तर

प्रयत्न:

df_group = df[df['type']=='CDS'].groupby(['symbol_id', 'symbol', 'type'])
df_new = pd.DataFrame(columns =['start', 'end'])
df_new[['start', 'end']] = df_group.agg({'start':'first', 'end': 'last'})
df_new.reset_index()

   symbol_id    symbol  start   end type
0   bus-201      bus    146     243 CDS
1   car-203      car    1058    650 CDS
2   train-204   train   202     837 CDS

@Dev Khadka . द्वारा उपयोग किए गए agg का उपयोग करके संपादित किया गया

1
Mohit Motwani 1 अक्टूबर 2019, 13:42

आप इसे ग्रुप बाय और फर्स्ट और लास्ट एग्रीगेट फंक्शन का उपयोग करके कर सकते हैं

df[df["type"]=="CDS"].groupby("symbol_id").agg({"start":"first", "end":"last", "symbol":"first","symbol_id":"first", "type":"first"})
2
Dev Khadka 1 अक्टूबर 2019, 13:36