簡體   English   中英

為什么pandas DataFrame中的列在此循環中不起作用?

[英]Why does a column from pandas DataFrame not work in this loop?

我有一個數據框,該數據框是從籃球運動員的名字中引用的。 下面的代碼是我構建DataFrame的方式。 它有5列播放器名稱,但每個名稱也都有播放器的位置。

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:

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)

我是python的新手,所以我確定我正在以一種非常繁瑣的方式進行此操作,並且希望提出有關如何更快地執行此操作的建議。 但是我的主要問題是,當我在各個列上運行代碼時,它可以正常工作,但是如果運行循環時,則會出現錯誤:

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

似乎循環df.column.str的一部分引起了某些問題? 我一直在用括號括起來的列表弄亂列表(我仍然不明白為什么有時我將DataFrame列放在括號中,有時是.column,但這是一個更大的問題)和其他隨機內容。

當我嘗試@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副本,但這是一個臨時副本,之后將其丟棄,因此實際的DataFrame不會更改。

如果位置標簽始終僅是一個字符,則簡單的解決方案是:

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

Series的str屬性使您可以進行字符串操作(包括索引編制),因此這只會將每個值的最后兩個字符修剪掉。

至於關於df.column的問題,這個問題比熊貓要籠統。 這兩件事是不一樣的:

# works
obj.attr

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

要訪問名稱存儲在變量中的屬性,則不能使用點號。 通常,您可以改用getattr函數。 但是,pandas通過將名稱指定為字符串 (而不是源代碼標識符)來提供用於訪問列的括號符號。 因此,這兩個是等效的:

df.some_column

columnName = "some_column"
df[columnName]

在您的示例中, df.column的引用df.columndf[column]應該可以解決該問題。 但是,正如我在評論中提到的那樣,您的代碼也存在其他問題。 就解決手頭的任務而言,我在回答之初顯示的字符串索引方法要簡單得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM