นุ่น: จะเปลี่ยนค่าทั้งหมดของคอลัมน์ได้อย่างไร?


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สามารถเป็นอะไรก็ได้ (สตริงจำนวนเต็มและอื่น ๆ ) ดังนั้นอาจเป็นการดีที่สุดที่จะลบคอลัมน์นี้ทั้งหมดจากนั้นแนบคอลัมน์อื่นที่มีเพียงปีเข้ากับ DataFrames?


1
สตริงและตัวเลขขึ้นอยู่กับว่ามีเฉพาะปี (เช่นมาดริดในตัวอย่าง) หรือมีเดือนและวัน (เช่น Pekin และ Paris)
brodrigues

คำตอบ:


132

ดังที่ @DSM ชี้ให้เห็นคุณสามารถทำได้โดยตรงมากขึ้นโดยใช้วิธีการสตริง vectorised :

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)

บางที 'Year' อาจเป็นชื่อที่ดีกว่าสำหรับคอลัมน์นี้ ...


1
ขอบคุณสำหรับคำตอบ แต่มันซับซ้อนกว่านั้น: บางครั้งค่าเป็นอย่างอื่นทั้งหมด (เช่นอักขระ) ฉันคิดว่ามันจะง่ายกว่าที่จะวางคอลัมน์นี้ทั้งหมดแล้วเพิ่มปีใหม่หรือแทนที่ค่าทั้งหมดภายในปี
brodrigues

1
@cbrunos โปรดให้ตัวอย่างที่ใช้ไม่ได้หรือไม่ ( แต่คุณสามารถปรับconvert_to_yearการจัดการกับมัน) ... df['Year']ผมยอมรับว่าชื่อที่เหมาะสมมากขึ้นจะ
Andy Hayden

1
@cbrunos สิ่งนี้น่าจะใช้ได้ดีสำหรับคุณ: for year in fr: df=fr[year]; df['Year_of_incorporation']=df['Date_of_incorporation'].map(convert_to_year).
Andy Hayden

df["Date"].str[-4:].astype(int)วันนี้ผมมักจะทำสิ่งที่ชอบ
DSM

1
@dmvianna หรือบางทีs.str.extract('(?P<year>\d{4})')
Andy Hayden

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(" ", "")))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.