Pandas: bagaimana cara mengubah semua nilai kolom?

91

Saya memiliki bingkai data dengan kolom yang dipanggil "Date"dan ingin semua nilai dari kolom ini memiliki nilai yang sama (hanya tahun). Contoh:

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

Yang saya inginkan adalah:

City     Date
Paris    2004
Lisbon   2004
Madrid   2004
Pekin    2004

Ini kode saya:

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

Itu terjadi di DataFrames saya, yang disebut misalnya fr['1961']nilai Date_of_incorporationcan apa saja (string, integer, dan sebagainya), jadi mungkin akan lebih baik untuk sepenuhnya menghapus kolom ini dan kemudian melampirkan kolom lain dengan hanya tahun ke DataFrames?

brodrigues
sumber
1
String dan angka tergantung apakah hanya ada tahun (seperti Madrid pada contoh), atau ada juga bulan dan hari (seperti untuk Pekin dan Paris).
brodrigues

Jawaban:

132

Seperti yang ditunjukkan @DSM, Anda dapat melakukan ini lebih langsung menggunakan metode string vektorisasi :

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

Atau menggunakan ekstrak (dengan asumsi hanya ada satu set digit dengan panjang 4 di suatu tempat di setiap string):

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

Cara alternatif yang sedikit lebih fleksibel, mungkin menggunakan apply(atau setara map) untuk melakukan ini:

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

Fungsi lambda, mengambil masukan dari Datedan mengubahnya menjadi satu tahun.
Anda dapat (dan mungkin harus) menulis ini dengan lebih jelas seperti:

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)

Mungkin 'Tahun' adalah nama yang lebih baik untuk kolom ini ...

Andy Hayden
sumber
1
Terima kasih atas jawabannya, tetapi ini lebih rumit dari itu: terkadang nilainya adalah sesuatu yang sama sekali berbeda (seperti karakter). Saya pikir akan lebih mudah untuk menghapus kolom ini sepenuhnya, dan kemudian menambahkan yang baru dengan tahun, atau mengganti nilai sepenuhnya berdasarkan tahun.
brodrigues
1
@cbrunos Tolong bisakah Anda memberikan contoh di mana ini tidak berhasil? (Tetapi Anda dapat menyesuaikan convert_to_yearuntuk menghadapinya) ... Saya setuju bahwa nama yang lebih tepat adalah df['Year'].
Andy Hayden
1
@cbrunos ini harus bekerja dengan baik untuk Anda: for year in fr: df=fr[year]; df['Year_of_incorporation']=df['Date_of_incorporation'].map(convert_to_year).
Andy Hayden
Akhir-akhir ini saya sering melakukan hal-hal seperti df["Date"].str[-4:].astype(int).
DSM
1
@dvianna atau mungkins.str.extract('(?P<year>\d{4})')
Andy Hayden
29

Anda dapat melakukan transformasi kolom dengan menggunakan apply

Tentukan fungsi bersih untuk menghapus dolar dan koma dan mengubah data Anda menjadi float.

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

Selanjutnya, sebutkan di kolom Anda seperti ini.

data['Revenue'] = data['Revenue'].apply(clean)
nim94
sumber
4

Atau jika seseorang ingin menggunakan lambdafungsi dalam applyfungsi tersebut:

data['Revenue']=data['Revenue'].apply(lambda x:float(x.replace("$","").replace(",", "").replace(" ", "")))
Tanmay
sumber