Pandalar: Bir sütunun tüm değerleri nasıl değiştirilir?


91

Sütun adı verilen bir veri çerçevem ​​var "Date"ve bu sütundaki tüm değerlerin aynı değere sahip olmasını istiyorum (yalnızca yıl). Misal:

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

İstediğim şey:

City     Date
Paris    2004
Lisbon   2004
Madrid   2004
Pekin    2004

İşte kodum:

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

Örneğin fr['1961'], DataFrame'lerimde değerleri Date_of_incorporationherhangi bir şey olabilir (dizeler, tamsayı vb.), Bu nedenle belki de bu sütunu tamamen silmek ve ardından DataFrame'lere yalnızca yılı içeren başka bir sütun eklemek en iyisidir?


1
Dizeler ve sayılar, yalnızca yılın (örnekteki Madrid gibi) olup olmadığına veya ayın ve günün (Pekin ve Paris gibi) olup olmadığına bağlı olarak değişir.
brodrigues

Yanıtlar:


132

@DSM'nin işaret ettiği gibi, bunu vektörleştirilmiş dize yöntemlerini kullanarak daha doğrudan yapabilirsiniz :

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

Veya özü kullanarak (her dizede bir yerde 4 uzunluğunda yalnızca bir rakam kümesi olduğunu varsayarak):

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

Biraz daha esnek bir alternatif, bunu yapmak için kullanmak apply(veya eşdeğer bir şekilde map) 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, girdiden girdiyi alıp Datebir yıla dönüştürmektir.
Bunu daha ayrıntılı bir şekilde yazabilirsin (ve belki yazmalısın):

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)

Belki de 'Yıl' bu sütun için daha iyi bir isimdir ...


1
Cevap için teşekkürler, ama durum bundan daha karmaşık: bazen değerler tamamen başka bir şeydir (karakterler gibi). Bence bu sütunu tamamen kaldırıp ardından yılla yenisini eklemenin veya değerleri yılla tamamen değiştirmenin daha kolay olacağını düşünüyorum.
brodrigues

1
@cbrunos Lütfen bunun işe yaramadığı bir örnek verebilir misiniz? (Ama convert_to_yearbununla başa çıkmak için ayarlayabilirsiniz ) ... Daha uygun bir adın olacağına katılıyorum df['Year'].
Andy Hayden

1
@cbrunos Bu senin için para cezası çalışması gerekir: for year in fr: df=fr[year]; df['Year_of_incorporation']=df['Date_of_incorporation'].map(convert_to_year).
Andy Hayden

Bu günlerde sık sık böyle şeyler yapıyorum df["Date"].str[-4:].astype(int).
DSM

1
@dmvianna veya belkis.str.extract('(?P<year>\d{4})')
Andy Hayden

29

Kullanarak bir sütun dönüşümü yapabilirsiniz. apply

Dolar ve virgülleri kaldırmak ve verilerinizi float'a dönüştürmek için temiz bir işlev tanımlayın.

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

Sonra, bunu sütununuzda şöyle arayın.

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

4

Veya lambdaişlevde işlev kullanmak istendiğinde apply:

data['Revenue']=data['Revenue'].apply(lambda x:float(x.replace("$","").replace(",", "").replace(" ", "")))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.