【问题标题】:Modify Pandas series through For loop [duplicate]通过For循环修改Pandas系列[重复]
【发布时间】:2020-05-22 10:06:17
【问题描述】:

我有一个带有项目详细信息的 Pandas DataFrame。其中一列是重量,一些值在重量列中存储为 200kgs、120kgs 等。

我想去掉“kgs”字符串,以便可以使用这些值进行一些计算。我尝试通过 For 循环做同样的事情来剥离“公斤”

item = pd.read_csv('item_data.csv') 

for x in item.Weight:  # item.Weight shows the weights of the items
    if type(x) == str:
        item.Weight = x.strip('kgs')
    else:
        item.Weight =  x

上面的代码去掉了“kgs”,但显示了所有行的第一个值!

item.Weight = [x.strip('kgs') if type(x)==str else x for x in item.Weight]

但是,当我执行列表理解时,如上所示,它可以工作!您能否解释一下为什么 For 循环似乎不起作用,但具有相同逻辑的 List Comprehension 起作用

【问题讨论】:

  • 在没有 For 循环的情况下尝试了 Series.str.strip() 并且成功了,感谢您的建议。但是,我想知道为什么 for 循环不起作用,并感谢 SubhashR 向我解释。

标签: python pandas


【解决方案1】:

用途:

item['Weight']=item.Weight.str.strip('kgs')

【讨论】:

    【解决方案2】:

    有一个内置方法.str.strip() 试试:

    item.str.rstrip('kgs')
    

    【讨论】:

    • 我在一个包含文本和 NaN 的系列的 for 循环中使用了它,但操作没有到位。有什么建议吗?
    【解决方案3】:

    使用Series.str.rstrip 将 kgs 删除到值的 右侧

    item['Weight']=item.Weight.str.rstrip('kgs')
    

    那么谁可以使用Series.astype 转换为floatint

    item['Weight']=item.Weight.str.rstrip('kgs').astype(float)
    #item['Weight']=item.Weight.str.rstrip('kgs').astype(int)
    

    pd.to_numericerrors = 'coerce' 然后检查是否有任何NaN 值及其来源。

    item['Weight']=pd.to_numeric(item.Weight.str.rstrip('kgs'),errors = 'coerce')
    

    【讨论】:

    • 如果某件事对你来说微不足道,并不意味着它对其他人来说微不足道;)
    【解决方案4】:

    在列表理解方法中,您基本上是在创建完整列表并分配给权重列,因此它按预期工作.. 尽管其他答案中提到的方法更有效。

    第一种方法不起作用,因为您一次将一个权重分配给整列而不是列表。

    【讨论】:

      猜你喜欢
      • 2018-10-18
      • 2018-12-01
      • 2018-07-18
      • 1970-01-01
      • 1970-01-01
      • 2019-12-01
      • 2016-04-25
      • 2013-07-19
      • 1970-01-01
      相关资源
      最近更新 更多