【问题标题】:im trying to run this code but for some reason it doesnt work can somebody help me?我试图运行这段代码,但由于某种原因它不起作用有人可以帮助我吗?
【发布时间】:2021-05-19 16:18:45
【问题描述】:
for i in df.Revenue:
  if df.Revenue.index(i) <= df.Revenue.mean():
    df.Revenue.index(i) = 0
  else:
    df.Revenue.index(i) = 1
print(df.Revenue)

语法错误是:不能分配给函数调用

【问题讨论】:

  • 你认为df.Revenue.index(i) = 0在做什么?
  • 它只是将索引的值替换为0不是吗?
  • 不,这不是 Python 的工作方式;你不能给函数调用的结果赋值,比如foo(bar) = 1——这是无效的。您可以为可索引对象的索引分配一个值,例如foo_list[bar] = 1
  • 好的。谢谢你帮了很多忙
  • df['Revenue'] = df['Revenue'].le(df['Revenue'].mean()).astype(int)

标签: python pandas numpy


【解决方案1】:

所以,函数df.Revenue.index(i) 为您提供df.Revenue 中的项目的索引。这是一个类似的例子:

d = {"a": [0.1, 0.2, 0.3, 0.4], "b": [1.0, 2.0, 3.0, 4.0], "c": [2.0, 4.0, 6.0, 8.0]}
df = pd.Series(d)
print(df.a.index(0.3)) # output: 2

上面代码的输出是2,因为对于a项目,值0.3的索引是2,因为a的项目是[0.1, 0.2, 0.3, 0.4]

因此,在您的情况下,如果您想用不同的值替换 df.Revenue 中的值,您首先要通过 idx = df.Revenue.index(value) 获取项目的索引,然后通过 df.Revenue[idx] = newvalue 设置它。

但是,根据您的其余代码,包括df.Revenue.index(i) &lt;= df.Revenue.mean() 行,我认为您可能只需要使用df.Revenue[i],并使用i 值的实际索引而不是@987654336 中的实际值@。这是因为df.Revenue.index(i) 返回一个索引,但您将它与df.Revenue.mean() 进行比较,这是Revenue 的值的平均值,因此将索引与值进行比较实际上没有意义。

因此,您的代码可能需要如下所示,尽管我无法确定其确切要求:

for value, i in enumerate(df.Revenue):
  if value <= df.Revenue.mean():
    df.Revenue[i] = 0
  else:
    df.Revenue[i] = 1
print(df.Revenue)

或者,没有enumerate

for i in range(len(df.Revenue)):
  if df.Revenue[i] <= df.Revenue.mean():
    df.Revenue[i] = 0
  else:
    df.Revenue[i] = 1
print(df.Revenue)

但是我不知道pandas 库,所以可能有一种更简单的方法可以做到这一点,但我主要是想尽可能地展示与你的代码相似的代码,除了它实际上是你想要的。

【讨论】:

  • 谢谢我在做这个高中项目,这已经耽误了我一段时间
  • 请不要在 pandas 中使用这样的循环,不要使用链式索引来分配值,不要使用点访问器来分配值,并且不要在循环时改变序列通过它,因为在这种方法下df["Revenue"].mean() 不断变化
  • df['Revenue'] = df['Revenue'].le(df['Revenue'].mean()).astype(int) 完成了这种基于循环的方法所做的一切
  • @PaulH 请随时用您建议的改进来更新我的答案,因为就像我说的那样,我对 pandas 模块一无所知
猜你喜欢
  • 1970-01-01
  • 2014-11-02
  • 2021-04-05
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-14
相关资源
最近更新 更多