2016-07-29 28 views
1

我有一個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()] 

我想分割位置。爲此我曾計劃爲每個名字列一個數據幀:

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) 

因爲我有五列,我想我會用一個循環

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 

做到這一點,那麼我會參加所有這些DataFrame返回到一起。

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列,有時它是列列號,但這是一個更大的問題)以及其他隨機事物。

當我嘗試@ BrenBarn的建議

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

以下彈起在Jupyter筆記本:

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]'。所以當列是一個變量時,你不能像那樣使用它。 – 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的問題,這個問題比熊貓更普遍。這兩件事情是不一樣的:

# works 
obj.attr 

# doesn't work 
attrName = 'attr' 
obj.attrName 

當你想要訪問名稱存儲在變量中的屬性時,你不能使用點符號。通常,您可以使用getattr函數。但是,pandas通過將名稱指定爲字符串(而不是源代碼標識符)來提供用於訪問列的括號符號。所以這兩者是等價的:

df.some_column 

columnName = "some_column" 
df[columnName] 

在你的榜樣,改變你的參考df.columndf[column]應該可以解決這個問題。但是,正如我在評論中提到的,您的代碼也有其他問題。就解決手頭的任務而言,我在回答開頭顯示的字符串索引方法要簡單得多。

+0

啊,謝謝! – vino88

+0

謝謝你的解決方案,不幸的是,當我在實際的DataFrame上嘗試它時,它實際上並沒有改變任何東西。在Jupyter筆記本中會出現一個紅色框,並指出'一個值試圖設置在DataFrame的一個切片副本上',並說這會引發一個SettingWithCopy錯誤。該文檔指出,此方法可能會返回DataFrame的臨時視圖副本,此副本將在以後拋出,因此無法運行。 – vino88

+1

@ vino88:然後請編輯您的問題,以包含一個展示問題的獨立示例。 (或者問一個單獨的問題,如果你的新問題真的是關於這個新的方法,並且與你在這裏發佈的代碼無關。) – BrenBarn

相關問題