我有一个DataFrame,我从篮球参考中获取了玩家名字。下面的代码是我如何构建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没有变化。
答案 0 :(得分: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
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[column]
可以解决该问题。但是,正如我在评论中提到的,您的代码也存在其他问题。至于解决手头的任务,我在答案开头展示的字符串索引方法要简单得多。