2016-10-04 8 views
5

मेरे पास एक एक्सेल फ़ाइल (.xlsx) है जिसमें लगभग 800 पंक्तियां और 128 कॉलम हैं जो ग्रिड में सुंदर घने डेटा के साथ हैं।डेटा फ्रेम पर पांड धीमा

xlsx = pandas.ExcelFile(filename) 
frame = xlsx.parse(xlsx.sheet_names[0]) 
media_frame = frame[media_headers] # just get the cols that need replacing 

from_filenames = get_from_filenames() # returns ~9500 filenames to replace in DF 
to_filenames = get_to_filenames() 

media_frame = media_frame.replace(from_filenames, to_filenames) 
frame.update(media_frame) 
frame.to_excel(filename) 

replace() 60 सेकंड लेता है: वहाँ 9500 के बारे में कोशिकाओं है कि मैं पांडा डेटा फ्रेम का उपयोग करने का कक्ष मान बदलने के लिए कोशिश कर रहा हूँ कर रहे हैं। इसे गति देने का कोई तरीका? यह बड़ा डेटा या कार्य नहीं है, मैं उम्मीद कर रहा था कि पांडा बहुत तेज़ी से आगे बढ़ें। FYI करें मैं सीएसवी में एक ही फाइल के साथ एक ही प्रसंस्करण कर रही कोशिश की, लेकिन समय की बचत कम से कम (replace() पर के बारे में 50 सेकंड)

+0

'from_filenames' और' to_filenames' 'dicts' की 'सूचियां' है? – jezrael

+0

@jezrael तारों की सिर्फ फ्लैट सूचियां नहीं। सेल मूल्य – Neil

उत्तर

6

रणनीति थी
फ़ाइल नाम के लिए फ़ाइल नाम से एक map का प्रतिनिधित्व pd.Series पैदा करते हैं।
stack हमारे dataframe, map, तो unstack

सेटअप

import pandas as pd 
import numpy as np 
from string import letters 

media_frame = pd.DataFrame(
    pd.DataFrame(
     np.random.choice(list(letters), 9500 * 800 * 3) \ 
      .reshape(3, -1)).sum().values.reshape(9500, -1)) 

u = np.unique(media_frame.values) 
from_filenames = pd.Series(u) 
to_filenames = from_filenames.str[1:] + from_filenames.str[0] 

m = pd.Series(to_filenames.values, from_filenames.values) 

समाधान

media_frame.stack().map(m).unstack() 

समय

5 x 5 dataframe

enter image description here

100 x 100

enter image description here

9500 x 800

enter image description here

9500 x 800
map बनाम dict
d = dict(zip(from_filenames, to_filenames))

enter image description here

का उपयोग कर
1

मुझे replace() को पूरी तरह से हटाकर 10 सेकंड में पूरा करने के लिए 60 सेकंड का कार्य मिला और एक समय में set_value() एक तत्व का उपयोग कर रहा था।

संबंधित मुद्दे