2012-09-26 13 views
35

मेरे पास "Date" नामक कॉलम वाला डेटा फ्रेम है और इस कॉलम के सभी मान समान मूल्य (केवल वर्ष) के लिए चाहते हैं। उदाहरण:पांडा: कॉलम के सभी मूल्यों को कैसे बदला जाए?

City  Date 
Paris 01/04/2004 
Lisbon 01/09/2004 
Madrid 2004 
Pekin 31/2004 

क्या मैं चाहता हूँ है:

City  Date 
Paris 2004 
Lisbon 2004 
Madrid 2004 
Pekin 2004 

यहाँ मेरी कोड है:

fr61_70xls = pd.ExcelFile('AMADEUS FRANCE 1961-1970.xlsx') 

#Here we import the individual sheets and clean the sheets  
years=(['1961','1962','1963','1964','1965','1966','1967','1968','1969','1970']) 

fr={} 

header=(['City','Country','NACE','Cons','Last_year','Op_Rev_EUR_Last_avail_yr','BvD_Indep_Indic','GUO_Name','Legal_status','Date_of_incorporation','Legal_status_date']) 

for year in years: 
    # save every sheet in variable fr['1961'], fr['1962'] and so on 
    fr[year]=fr61_70xls.parse(year,header=0,parse_cols=10) 
    fr[year].columns=header 
    # drop the entire Legal status date column 
    fr[year]=fr[year].drop(['Legal_status_date','Date_of_incorporation'],axis=1) 
    # drop every row where GUO Name is empty 
    fr[year]=fr[year].dropna(axis=0,how='all',subset=[['GUO_Name']]) 
    fr[year]=fr[year].set_index(['GUO_Name','Date_of_incorporation']) 

यह मेरी DataFrames, उदाहरण के fr['1961'] के लिए कहा जाता है में होता है कि Date_of_incorporation के मूल्यों कर सकते हैं कुछ भी हो (तार, पूर्णांक, और इतने पर), तो शायद इस कॉलम को पूरी तरह मिटाना सबसे अच्छा होगा और फिर डेटाफ्राम में केवल वर्ष के साथ एक और कॉलम संलग्न करें es?

+1

क्या तिथियां सिर्फ तार हैं? –

+0

स्ट्रिंग्स और संख्याएं इस पर निर्भर करती हैं कि क्या केवल वर्ष है (उदाहरण के लिए मैड्रिड के लिए), या क्या महीने और दिन भी है (जैसे पेकिन और पेरिस के लिए)। – brodrigues

उत्तर

62

@DSM बताते हैं, आपको अधिक सीधे vectorised string methods का उपयोग कर ऐसा कर सकते हैं:

df['Date'].str[-4:].astype(int) 

या इसका उपयोग करते निकालने (यह मानते हुए केवल एक-एक स्ट्रिंग में लंबाई 4 कहीं के अंकों का सेट है):

+०१२३५१६४१०६१:
df['Date'].str.extract('(?P<year>\d{4})').astype(int) 

एक वैकल्पिक थोड़ा और अधिक लचीला तरीका, apply (या समतुल्य रूप map) का उपयोग करने के यह करने के लिए हो सकता है

df['Date'] = df['Date'].apply(lambda x: int(str(x)[-4:])) 
      # converts the last 4 characters of the string to an integer 

लैम्ब्डा फ़ंक्शन, Date से इनपुट ले रहा है और इसे एक वर्ष में परिवर्तित कर रहा है।
आप (और शायद चाहिए) इस वरबोस रूप में दर्शा लिख ​​सकता है के रूप में:

def convert_to_year(date_in_some_format); 
    date_as_string = str(date_in_some_format) 
    year_as_string = date_in_some_format[-4:] # last four characters 
    return int(year_as_string) 

df['Date'] = df['Date'].apply(convert_to_year) 

शायद द ईयर 'इस स्तंभ के लिए एक बेहतर नाम है ...

+0

उत्तर के लिए धन्यवाद, लेकिन यह उससे अधिक जटिल है: कभी-कभी मान पूरी तरह से कुछ होते हैं (वर्णों की तरह)। मुझे लगता है कि यह कॉलम पूरी तरह से इस कॉलम को छोड़ने के लिए आसान हो सकता है, और उसके बाद साल के साथ एक नया जोड़ें, या साल भर मूल्यों को पूरी तरह से बदलें। – brodrigues

+0

@cbrunos कृपया आप एक उदाहरण प्रदान कर सकते हैं जहां यह काम नहीं करता है? (लेकिन आप इसके साथ निपटने के लिए 'convert_to_year' समायोजित कर सकते हैं) ... मैं सहमत हूं कि एक अधिक उपयुक्त नाम 'डीएफ [' वर्ष ']' होगा। –

+0

मैंने ओपी में अपना कोड और अधिक सटीक जोड़ा। – brodrigues

1

आप का उपयोग करके एक स्तंभ परिवर्तन कर सकते हैं apply

डॉलर और कॉमा को हटाने और अपने डेटा को फ्लोट करने के लिए एक साफ फ़ंक्शन को परिभाषित करें।

def clean(x): 
    x = x.replace("$", "").replace(",", "").replace(" ", "") 
    return float(x) 

अगला, इसे इस तरह अपने कॉलम पर कॉल करें।

data['Revenue'] = data['Revenue'].apply(clean) 
संबंधित मुद्दे