2016-07-29 2 views
1

플레이어 이름과 함께 basketball-reference에서 가져온 DataFrame이 있습니다. 아래의 코드는 DataFrame을 작성한 방법입니다. 그것은 5 칼럼의 플레이어 이름을 가지고 있지만, 각 이름은 또한 플레이어의 위치를 ​​가지고 있습니다.pandas DataFrame의 열이이 루프에서 작동하지 않는 이유는 무엇입니까?

url = "http://www.basketball-reference.com/awards/all_league.html" 
dframe_list = pd.io.html.read_html(url) 
df = dframe_list[0] 
df.drop(df.columns[[0,1,2]], inplace=True, axis=1) 
column_names = ['name1', 'name2', 'name3', 'name4', 'name5'] 
df.columns = column_names 
df = df[df.name1.notnull()] 

위치를 분리하려고합니다. 그래서 각각의 이름 열에 대한 DataFrame하기 위해 계획했던 수행합니다 나는 내가 루프

column_names = ['name1', 'name2', 'name3', 'name4', 'name5'] 
for column in column_names: 
    column = pd.DataFrame(df.column.str.split().tolist()).ix[:,0:1] 
    column[0] = column[0] + " " + column[1] 
    column.drop(column.columns[[1]], inplace=True, axis=1) 
    column.columns = column 

이 할 것이라고 생각 다섯 개의 열을 가지고 있기 때문에

name1 = pd.DataFrame(df.name1.str.split().tolist()).ix[:,0:1] 
name1[0] = name1[0] + " " + name1[1] 
name1.drop(name1.columns[[1]], inplace=True, axis=1) 

을 그리고 나는 모든 가입 것 이 DataFrames는 다시 함께합니다.

df_NBA = [name1, name2, name3, name4, name5] 
df_NBA = pd.concat(df_NBA, axis=1) 

나는 파이썬에 새로 온 사람, 그래서 내가 꽤 번거로운 방식으로이 일을 그리고 난이 더 빨리 할 수있는 방법으로 제안을 사랑하는 것입니다 확신합니다. 하지만 그것은 잘 작동 개별 열에서 코드를 실행하면 내 주요 질문은,하지만 루프를 실행할 때이 오류가 발생하는 경우 :

AttributeError: 'DataFrame' object has no attribute 'column' 

루프 df.column.str의 일부가 어떤 문제를 일으키는 것으로 보인다 ? 나는 열거 형 브래킷을 사용하여 목록을 둘러 보았습니다. (때때로 나는 때때로 DataFrame 열을 괄호로 묶는 것이고 때로는 .column이지만 더 큰 문제입니다) 및 기타 임의적 인 것들을 이해하지 못합니다. 나는 Jupyter 노트북에 BrenBarn의 제안 @

df.apply(lambda c: c.str[:-2]) 

다음 팝을하려고하면

는 :

SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame 

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 
    if __name__ == '__main__': 

가 DataFrame 보면 내가 제대로이 문서를 이해한다면, 아무것도 실제로 변경하지 않고있다 메서드는 편집 된 DataFrame 복사본을 만듭니다. 그러나 나중에 실제 데이터 프레임이 변경되지 않도록 가져 오는 임시 복사본입니다.

+0

만약 당신이'df [column]'을 쓰면 그것도 작동하지 않는다는 말입니까? – BrenBarn

+2

'df.column'은'df [column]'이 아니라'df [ 'column']'에 해당합니다. 따라서 column이 변수 일 때는 사용할 수 없습니다. – ayhan

+0

@BrenBarn, 예,'df [column]','df [ 'column']'을 사용하면 작동하지 않습니다. @ayhan이 말하는 것 같아요. 그래서 대답이 있습니까? – vino88

답변

2

위치 라벨은 항상 하나 개의 문자 인 경우는 간단한 해결책이있다 :

>>> df.apply(lambda c: c.str[:-2]) 
      name1   name2 
0  Marc Gasol Lebron James 
1  Pau Gasol Kevin Durant 
2 Dwight Howard Kyrie Irving 

시리즈의 str 속성은 인덱싱을 포함한 문자열 작업을 수행 할 수 있습니다, 그래서 이것은 단지 마지막 두 문자를 트림 각 값을 끕니다.

df.column에 대한 귀하의 질문에 대해서는이 문제가 팬더보다 일반적입니다. 이 두 가지는 동일하지 않습니다.

변수에 이름이 저장된 속성에 액세스하려면 점 표기법을 사용할 수 없습니다. 일반적으로 getattr 함수를 대신 사용할 수 있습니다. 그러나 팬더는 문자열 (소스 코드 식별자가 아닌)으로 이름을 지정하여 열에 액세스하기위한 대괄호 표기법을 제공합니다. 당신의 예에서

df.some_column 

columnName = "some_column" 
df[columnName] 

을 그 문제를 해결해야 df.columndf[column]에로 참조를 변경 : 그래서이 둘은 동일합니다. 그러나 주석에서 언급했듯이 코드에는 다른 문제가 있습니다.지금 당면한 과제를 해결하는 한, 답변의 시작 부분에 보여준 문자열 인덱싱 방식은 훨씬 간단합니다.

+0

아, 고마워요! – vino88

+0

솔루션을 제공해 주셔서 감사합니다. 불행히도 실제 DataFrame에서이 작업을 시도해도 아무 것도 실제로 변경되지 않습니다. Jupyter 노트북에서는 빨간색 상자가 나타나며 '값이 DataFrame의 슬라이스 복사본에 설정하려고 시도하고 있습니다'라는 메시지가 표시되고 SettingWithCopy 오류가 발생합니다. 설명서는이 메서드가 나중에 실행되지 않도록 가져온 DataFrame의 임시보기 복사본을 반환 할 수 있다고 설명합니다. – vino88

+1

@ vino88 : 그런 다음 질문을 편집하여 문제를 보여주는 자체 포함 된 예제를 포함하십시오. (또는 새로운 질문이 정말이 새로운 방법에 관한 것이고 여기에 게시 한 코드와 관련이없는 경우 별도의 질문을하십시오.) – BrenBarn

관련 문제