繁体   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