【问题标题】:python string replace conditionalpython字符串替换条件
【发布时间】:2015-02-02 12:42:24
【问题描述】:

我使用了很多 stata,但在我的新工作中,他们不会为我支付许可证,而且 excel 不足以做好工作。

我想知道如何使用条件(Pandas 中的 DataFrame)替换列中的值。

我试过了:

spot['tipo'] = np.where(['programa']=='CLASSIFICADOES' & ['espec']=='', 'N')

这给了我

TypeError: unsupported operand type(s) for &: 'str' and 'list'

并尝试过:

spot.ix('programa'=='CLASSIFICADOES' & ['espec']=='', 'tipo') = 'N'

这给了我:

SyntaxError: can't assign to function call

和:

spot.replace(['tipo'],['N']) if spot['programa'] == 'CLASSIFICADOES' & ['espec']==''

这是一个无效的语法。 (这个和我在 stata 上做的更相似) 我在处理字符串时遇到了很多问题,我通常可以在网上找到一些解决方案的数字部分。

In [79]: spot.dtypes
Out[79]: 
marca        object
data         object
rede         object
tipo         object
programa     object
titulo       object
valor       float64
cm            int64
col           int64
area          int64
descr        object
espec        object
dtype: object

【问题讨论】:

  • 不正确的语法,应该是:spot['tipo'] = np.where((spot['programa']=='CLASSIFICADOES') & (spot['espec']=='', 'N')) 注意由于运算符优先级而需要使用括号,并且您需要索引 df 本身,您比较的是一个包含单个条目的列表一个字符串
  • 嘿 Ed,这给了我“ValueError:操作数无法与形状一起广播 (4692,) (2,)”
  • 尝试:spot['tipo'] = np.where((spot['programa']=='CLASSIFICADOES') & (spot['espec']=='', 'N', spot['tipo'])),无论如何我认为我的回答向您展示了另一种应该有效的方法
  • 我想我在第一条评论中有错字试试这个:spot['tipo'] = np.where((spot['programa']=='CLASSIFICADOES') & (spot['espec']==''), 'N') 第二个条件的右括号在错误的位置

标签: python string numpy pandas


【解决方案1】:

您尝试的有多个错误:

spot['tipo'] = np.where(['programa']=='CLASSIFICADOES' & ['espec']=='', 'N')

应该是:

spot['tipo'] = np.where((spot['programa']=='CLASSIFICADOES') & (spot['espec']==''), 'N', spot['tipo'])

注意由于运算符优先级而需要使用括号,并且您需要索引 df 本身,您比较的是一个包含单个条目的列表,该条目是一个字符串。

spot.ix('programa'=='CLASSIFICADOES' & ['espec']=='', 'tipo') = 'N'

应该是:

spot.ix[(spot['programa']=='CLASSIFICADOES') & (spot['espec']==''), 'tipo'] = 'N'

原因同上

【讨论】:

  • spot['tipo'] = np.where((spot['programa']=='CLASSIFICADOES') & (spot['espec']==''), 'N') 似乎是对的,但现在 python 告诉我 np.where 应该同时具有 x、y 或没有。我只给了 x,我希望“否则它保持相同的值”spot.ix((spot['programa']=='CLASSIFICADOES') & (spot['espec']==''), 'tipo') = 'N' 给了我同样的错误
  • 试试:spot['tipo'] = np.where((spot['programa']=='CLASSIFICADOES') & (spot['espec']==''), 'N', spot['tipo'])
  • 这就是它 Ed!谢谢,实际上它不会给我错误,也不会做任何事情。但是如果我使用除了 espec=='' 之外的其他条件,它可以完美地工作,所以我在 espec 上的数据,字符串一定是乱七八糟的。但这是另一个问题。你解决了我的一段代码。谢谢!
  • 不用担心您最后的努力,您应该查阅文档:pandas.pydata.org/pandas-docs/stable/generated/… 或者tutorial 以掌握基础知识
  • 我什至读过“潜入python”,但起初有点难以看出我自己的错误。我也处理过 (spot['espec']==''),我使用了 pandas pandas.isnull(spot['espec']) ,它在 NaN 上的计算结果为真,然后我的条件得到满足!
【解决方案2】:

我认为你应该使用这样的东西

Var= 'Yes' if fruit == 'Apple' else 'No'

在你的情况下,我不完全理解你的代码,但我认为 meybe 是这样的。

spot['tipo'] = 'N' if (np.where(['programa']=='CLASSIFICADOES' & ['espec']=='')) else ''

【讨论】:

  • 我收到TypeError: unsupported operand type(s) for &: 'str' and 'list'
  • 我需要查看漏洞代码以了解此变量中的内容。 “np”来自哪里。 'espec' 在哪里?而python运算符是“和”我的错误。点['tipo'] = 'N' if (np.where(['programa']=='CLASSIFICADOES' and ['espec']=='')) else ''
  • 我将 numpy 导入为 np,将 pandas 导入为 pd,这是标准的东西。正如我所说,我在 pandas 中使用数据框 dataframe = spot spot['espec'] 调用名为 espec 的列,我用 np.where 解决了它,而不使用 if then else。 (np.where 已经这样做了)我的解决方案:spot['tipo'] = np.where((spot['programa']=='CLASSIFICADOES') & pd.isnull(spot['espec']), 'N', (spot['tipo']))
猜你喜欢
  • 2021-10-08
  • 2014-03-13
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 2012-06-12
  • 2021-06-19
相关资源
最近更新 更多