Pandas : 열의 모든 값을 변경하는 방법은 무엇입니까?


87

열이있는 데이터 프레임 "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

답변:


128

@DSM이 지적했듯이 벡터화 된 문자열 메서드를 사용하여이 작업을 더 직접 수행 할 수 있습니다 .

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을 받아 1 년으로 변환합니다.
다음과 같이 더 자세하게 작성할 수 있습니다.

def convert_to_year(date_in_some_format);
    date_as_string = str(date_in_some_format)
    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})')
앤디 헤이든

29

다음을 사용하여 열 변환을 수행 할 수 있습니다. apply

달러와 쉼표를 제거하고 데이터를 부동으로 변환하는 깨끗한 함수를 정의하십시오.

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

다음으로, 당신의 칼럼에서 이렇게 부르십시오.

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

3

또는 lambda함수에서 함수 를 사용하려는 경우 apply:

data['Revenue']=data['Revenue'].apply(lambda x:float(x.replace("$","").replace(",", "").replace(" ", "")))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.