पंडों: एक कॉलम के सभी मूल्यों को कैसे बदला जाए?


91

मेरे पास एक कॉलम के साथ एक डेटा फ्रेम है "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जा सकता है कुछ भी हो सकता है (स्ट्रिंग्स, पूर्णांक, और इसी तरह), इसलिए हो सकता है कि इस स्तंभ को पूरी तरह से मिटा दें और फिर DataFames के लिए केवल वर्ष के साथ एक और कॉलम संलग्न करें?


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

जवाबों:


132

जैसा कि @DSM बताता है, आप इसे सीधे वेक्टर किए गए स्ट्रिंग तरीकों का उपयोग करके कर सकते हैं :

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)  # cast to string
    year_as_string = date_in_some_format[-4:] # last four characters
    return int(year_as_string)

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

शायद 'ईयर' इस कॉलम का बेहतर नाम है ...


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

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

1
@ cbrunos यह आपके लिए ठीक काम करना चाहिए for year in fr: df=fr[year]; df['Year_of_incorporation']=df['Date_of_incorporation'].map(convert_to_year):।
एंडी हेडन

इन दिनों मैं अक्सर ऐसी चीजें करता हूं df["Date"].str[-4:].astype(int)
डीएसएम

1
@ मडियनना या शायदs.str.extract('(?P<year>\d{4})')
एंडी हेडन

29

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

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

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

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

data['Revenue'] = data['Revenue'].apply(clean)

4

या यदि कोई lambdaफ़ंक्शन में फ़ंक्शन का उपयोग करना चाहता है apply:

data['Revenue']=data['Revenue'].apply(lambda x:float(x.replace("$","").replace(",", "").replace(" ", "")))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.