【问题标题】:Issue with for loop - Pandasfor 循环的问题 - Pandas
【发布时间】:2018-12-15 23:10:32
【问题描述】:

我正在尝试使用 Pandas 清理 df。我有一列包含四种可能的东西:

  1. X.X 磅
  2. X.X 磅
  3. X.X 盎司
  4. NaN

df.weight.fillna(0, inplace=True)
for i in [0, df.weight.size-1]:
    cell = df.weight[i]
    while (cell == 0 and i < df.weight.size-1):
        i += 1
        cell = df.weight[i]
    if (cell != 0):
        number = ''.join([x for x in cell if (x.isdigit() or 
        if bool(re.search('ounces', cell)):
            df.loc[i, 'weight'] = number * 0.0625    # Ounces to pounds conversion
    else:
        df.loc[i, 'weight'] = number

上面代码的目的是遍历'weight'的行并检查:

  • 如果单元格 == 0 -> 只是跳过(当我尝试使用正则表达式时会出现问题,因此 while 循环);
  • 如果单元格有“盎司”-> 只保留数字和“.”;将数字转换为磅
  • 如果单元格有“磅”或“磅” -> 只保留数字和“。”

因此,理想情况下,“1.0 磅”之类的条目应变为“1.0”,“1 盎司”之类的条目应变为“0.0625”。

我得到的是,这段代码只改变了第一次出现('1.0 lbs' -> '1.0'),而其他的保持不变

输入:

2.1 磅 - 5.5 磅 - 8.8 盎司 - 0

输出:

2.1 - 5.5 - 0.55 - 0

【问题讨论】:

  • 请提供一些真实的输入和预期的输出数据。
  • 同时更正您在第一个 for 语句下的缩进
  • done :) 指出来
  • 不就是\d+(?:\.\d+)?

标签: python regex pandas for-loop


【解决方案1】:

在 Python 中

 for i in [0, df.weight.size-1]:

表示对[0, df.weight.size-1] 两个项目0 和df.weight.size-1 的列表 循环。你的意思可能是这样的:

for i in range(df.weight.size)

或类似的东西。我怀疑您的代码还有其他问题,但这是第一个问题。

顺便说一句,如果您想对系列中的每个项目应用一些转换,请定义一个函数来为 单个 项目实现该转换,然后将其应用于所有项目使用Series.apply() 的项目。在这种情况下,例如df.weight = df.weight.apply(your_function)。如果转换依赖于系列中的其他值,事情会变得有点复杂,但这里的情况似乎并非如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 2018-11-05
    • 1970-01-01
    • 2013-07-14
    • 2021-05-10
    相关资源
    最近更新 更多