pandas.DataFrame.replace不使用inplace=True工作

2024-10-01 15:49:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我做了很多搜索,试图找出是否有人有这个问题,我找不到解决办法(或者我只是不善于寻找)

我有一个python脚本,它有两个函数:

  1. 根据多个项目的累计月营业额计算月营业额
  2. 更改项目的代码,使以字母R结尾的任何代码现在都以0结尾

我遇到的第一个问题是,当脚本检测到代码以R结尾时,用0替换它是不成功的。下面是执行以下操作的代码(所有代码的格式均为XYZ.1234):

if dataset.iloc[i, 1][7:] == "R":
    new_code = dataset.iloc[i, 1][:7] + "0"
    dataset.replace([i, 1], new_code, inplace=True, regex=True)

我遇到的第二个问题是运行脚本时产生的错误。据我所知,这个错误与脚本的初始部分有关,该部分计算累积营业额的差异,以获得每月营业额。我遇到的错误是,它说我试图以浮点形式传递字符串,但这不应该发生,因为第4列总是一个数字。以下是错误:

Traceback (most recent call last):
  File "D:\tempWork\turnover_test.py", line 12, in <module>
    calcualted_turnover = float(dataset.iloc[i+1, 3]) - float(dataset.iloc[i, 3])
ValueError: could not convert string to float: 'BAM.1670'

这些问题可能有关联,但我不太确定。任何帮助都将不胜感激!(营业额数字不是实际值,而是脚本运行的占位符)

完整代码:

import pandas as pd
import datetime
 
dataset = pd.read_csv("turnover.csv")
 
turnover = [0.0]
 
dataset = dataset.fillna(0)
 
for i in range(len(dataset)-1):
    if dataset.iloc[i, 0] == dataset.iloc[i+1, 0]:
        calcualted_turnover = float(dataset.iloc[i+1, 3]) - float(dataset.iloc[i, 3])
    else:
        if datetime.datetime.strptime(dataset.iloc[i+1, 2], "%d/%m/%Y") >= datetime.datetime(year=2018, month=1, day=1):
            calcualted_turnover = dataset.iloc[i+1, 3]
        else:
            calcualted_turnover = 0
    turnover.append(calcualted_turnover)
    if dataset.iloc[i, 1][7:] == "R":
        new_code = dataset.iloc[i, 1][:7] + "0"
        dataset.replace([i, 1], new_code, inplace=True, regex=True)
 
dataset["turnover"] = turnover
 
dataset.to_csv('turnover_complete.csv', index=False)

编辑:抱歉,下面是一个具有预期输出的示例输入

输入

Project_Id Project_Number Reporting_Period   Cost To Date
2298       BAM.168R       01/10/2018         100
2298       BAM.168R       01/11/2018         120
2298       BAM.168R       01/12/2018         300
2298       BAM.168R       01/01/2019         550
3015       BOP.1203       01/01/2020         110
3015       BOP.1203       01/02/2020         113
3015       BOP.1203       01/03/2020         190
3015       BOP.1203       01/04/2020         210

输出

Project_Id Project_Number Reporting_Period   Cost To Date   Turnover
2298       BAM.1680       01/10/2018         100            100
2298       BAM.1680       01/11/2018         120            20
2298       BAM.1680       01/12/2018         300            180
2298       BAM.1680       01/01/2019         550            250
3015       BOP.1203       01/01/2020         110            110
3015       BOP.1203       01/02/2020         113            3
3015       BOP.1203       01/03/2020         190            77
3015       BOP.1203       01/04/2020         210            20

Tags: csv代码脚本truenewdatetimeif错误
1条回答
网友
1楼 · 发布于 2024-10-01 15:49:20

与其使用.iloc查找单个行和列值,不如使用pandas的强大功能一次处理整个数据帧。根据需要创建新列,然后可以从新列中提取数据

错误1:可以通过一次测试所有行来替换。测试列是否以“R”结尾,如果是,则附加一个“O”

错误2:BAM.1670是一个字符串。你是说第四列是一个数字,所以我认为你想在“迄今为止的成本”列工作,但你得到的是项目编号列,所以你的索引可能是错误的。无论如何,您可以使用列名而不是iloc查找值。看起来您需要使用.shift()函数将一行与另一行进行比较,但我不确定您想做什么

df.loc[df['Project_Number'].str.endswith('R'), 'Project_Number'] += 'O'

df['calculated turnover'] = df['Cost To Date'] - df['Cost To Date'].shift(1)
# shift(1) = previous row   shift(-1) = next row

只有在项目编号相同的情况下,才能进行营业额计算。此外,其中一行的值为空,因为第一行没有上一行(如果在最后一行使用shift(-1),则没有下一行)

相关问题 更多 >

    热门问题