2012-09-26 24 views
35

"Date" adlı bir sütunu içeren bir veri çerçevem ​​var ve bu sütundaki tüm değerlerin aynı değere sahip olmasını istiyorum (yalnızca yıl). Örnek:Pandalar: Bir sütunun tüm değerlerini nasıl değiştirebilirim?

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

İstediğim: İşte

City  Date 
Paris 2004 
Lisbon 2004 
Madrid 2004 
Pekin 2004 

benim kodudur:

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']) 

Bu örnek fr['1961'] çağrısında benim DataFrames, içinde olur Date_of_incorporation değerleri can herhangi bir şey (dizeler, tamsayı, vb.) olabilir, bu yüzden bu sütunu tamamen silmek en iyisi olur ve daha sonra DataFram'a yalnızca bir yıl ile başka bir sütun ekler es?

+1

Tarihler sadece dizeler mi? –

+0

Yalnızca yıl (Madrid örneğinde olduğu gibi) olup olmadığını veya ay ve gün olup olmadığını (Pekin ve Paris için olduğu gibi) bağlı olarak dizeler ve sayılar. – brodrigues

cevap

62

@DSM işaret ettiği gibi, daha doğrudan vectorised string methods kullanarak bunu yapabilirsiniz: (Her dizede bir yere uzunluğu 4 basamak sadece bir set var varsayarak)

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

Veya kullanarak özü:

:
df['Date'].str.extract('(?P<year>\d{4})').astype(int) 

biraz daha esnek bir şekilde bir alternatif, bunu yapmak için apply (ya da eşit şekilde map) kullanmak olabilir

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

Lambda işlevi, girdiyi Date'dan alıp bir yıla dönüştürmektir. Belki 'Yıl'

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) 

bu sütun için daha iyi bir isim ...

+0

Cevabınız için teşekkürler, ancak bundan daha karmaşıktır: bazen değerler tamamen farklıdır (karakterler gibi). Sanırım bu sütunu tamamen kaldırmak daha kolay olur ve sonra da yılla birlikte yenisini ekler ya da değerleri yılın sonuna kadar değiştirirsiniz. – brodrigues

+0

@cbrunos Bunun işe yaramadığı bir örnek verebilir misiniz? (Ama 'convert_to_year' ile başa çıkabilmek için ayarlayabilirsiniz.) Daha uygun bir adın 'df [' Year '] 'olacağını kabul ediyorum. –

+0

Koduma ve daha fazla kesinliği OP'ye ekledim. – brodrigues

1

Sen kullanarak bir sütun dönüşümü yapabilirsiniz: olarak
Sen (ve belki de olmalı) daha verbosely bu yazabiliriz apply

Dolar ve virgülleri silmek ve verilerinizi şamandıraya dönüştürmek için temiz bir işlev tanımlayın.

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

Ardından, bunu sütununda bunun gibi arayın.

data['Revenue'] = data['Revenue'].apply(clean) 
İlgili konular