パンダ:列のすべての値を変更する方法は?


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

たとえば、と呼ばれる私のDataFrameではfr['1961']、の値はDate_of_incorporation任意(文字列、整数など)である可能性があるため、この列を完全に消去してから、年のみの別の列をDataFrameにアタッチするのが最善でしょうか?


1
文字列と数字は、年のみがあるか(例のマドリッドの場合)、または月と日もあるか(PekinとParisの場合)によって異なります。
brodrigues 2012

回答:


132

@DSMが指摘しているように、ベクトル化された文字列メソッドを使用して、これをより直接的に行うことができます。

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

または、extractを使用します(各文字列のどこかに長さ4の数字のセットが1つしかない場合):

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それを1年に変換しています。
あなたはこれをもっと冗長に書くことができます(そしておそらくそうすべきです):

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)

おそらく「年」はこの列のより良い名前です...


1
回答ありがとうございますが、それよりも複雑です。値がまったく別のもの(文字など)である場合があります。この列を完全に削除してから、新しい列を年に追加するか、値を年に完全に置き換える方が簡単だと思います。
brodrigues 2012

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.