for循环的问题-熊猫

时间:2018-07-07 17:58:41

标签: python regex pandas for-loop

我正在尝试使用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”行并检查:

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

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

相反,我得到的是这段代码仅更改了第一次出现的内容(“ 1.0磅”->“ 1.0”),而其他内容保持不变

输入:

2.1磅-5.5磅-8.8盎司-0

输出:

2.1-5.5-0.55-0

1 个答案:

答案 0 :(得分:1)

在Python中

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

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

for i in range(df.weight.size)

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

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