পান্ডস: কলামের সমস্ত মান কীভাবে পরিবর্তন করবেন?


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

এটি ঘটে যায় যে আমার ডেটাফ্রেমে উদাহরণস্বরূপ বলা fr['1961']হয় এর মানগুলি Date_of_incorporation(স্ট্রিং, পূর্ণসংখ্যা এবং আরও কিছু) হতে পারে, তাই সম্ভবত এই কলামটি পুরোপুরি মুছে ফেলা এবং তারপরে কেবল বছরের সাথে অন্য কলামটি ডেটাফ্রেমে সংযুক্ত করা ভাল?


4
স্ট্রিং এবং সংখ্যাগুলি নির্ভর করে কেবলমাত্র বছর আছে (উদাহরণস্বরূপ মাদ্রিদের মতো), অথবা মাস এবং দিনও রয়েছে কিনা (পেকিন এবং প্যারিসের মতো) depending
ব্রোডরিগ

উত্তর:


132

@ ডিএসএম যেমন উল্লেখ করেছে, আপনি ভেক্টরাইজড স্ট্রিং পদ্ধতিগুলি ব্যবহার করে আরও সরাসরি এটি করতে পারেন :

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)

সম্ভবত 'বছর' এই কলামটির আরও ভাল নাম ...


4
উত্তরের জন্য ধন্যবাদ, তবে এটি তার চেয়ে জটিল: কখনও কখনও মানগুলি সম্পূর্ণরূপে অন্যরকম কিছু হয় (অক্ষরের মতো)। আমি মনে করি এই কলামটি পুরোপুরি ছেড়ে দেওয়া সহজ হবে, এবং তারপরে বছরের সাথে একটি নতুন যুক্ত করা, বা বছর দ্বারা মানগুলি পুরোপুরি প্রতিস্থাপন করা উচিত।
ব্রড্রিগ

4
@cbrunos দয়া করে আপনি একটি উদাহরণ প্রদান করতে পারেন যেখানে এটি কাজ করে না? (তবে আপনি convert_to_yearএটি মোকাবেলা করতে সামঞ্জস্য করতে পারেন ) ... আমি সম্মত হলাম যে আরও উপযুক্ত নাম হবে df['Year']
অ্যান্ডি হেডেন

4
@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)
ডিএসএম

4
@ ডিএমভিয়ানা বা সম্ভবত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(" ", "")))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.