有条件地加一个数

2024-09-30 01:37:18 发布

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

我有一个像这样的日期框:

  ID     FirstNumberHour     NewFirst     LastNumberHour     NewLast
  1        7.0                7a           4.0               4p
  2        2.0                2a           10.0             10p
  3        4.0                4p           11.0             11p

FirstNumberHour变量是通过以下代码从NewFirst变量创建的:

DF['FirstNumberHourUpdate'] = pd.to_datetime(DF['NewLast']+['m'], format='%H%p').dt.hour

为了将NewFirstNewLast转换为24小时时间变量,我想有条件地将12添加到对应的First/LastNumberHour具有“p”的时间中。新变量是对象,First/LastNumberHour是float64。例如,输出表如下所示:

  ID     FirstNumberHourUpdate     NewFirst     LastNumberHourUpdate     NewLast
  1        7.0                     7a          16.0                   4p
  2        2.0                     2a          22.0                   10p
  3        16.0                    4p          23.0                   11p

我希望进行此转换,同时还要记住,我需要将新创建的hour变量添加到日期变量,创建一个datetime变量

我尝试了下面的代码,但它产生了一个很长的错误

T=12
DF['FirstNumberHourUpdate']=np.where(DF["NewFirst"].str.contains("p"),DF.FirstNumberHour + float(T),DF.FirstNumberHour)

TypeError: can only concatenate str (not "float") to str

读到这个错误TypeError: can only concatenate str (not "float") to str但是根据这个,它说我需要将我的NewFirst变量转换成float变量;但是,如果我这样做,是否能够基于“p”条件执行此查询

答复:

DF["L"] = [12 if "p" in item else 0 for item in DF["NewLast"].astype(str).values]
DF.loc[:, "LastNumberHourUpdate"] = DF.loc[:, "LastNumberHour"].astype(int) + DF.L

Tags: to代码iddfdatetime时间float条件
1条回答
网友
1楼 · 发布于 2024-09-30 01:37:18

如果我理解正确,您希望基于另一列内容向列添加值。解决这一问题的方法如下。我将使用一个发明的数据框架,使其更通用,更易于阅读

基本阵列和数据帧:

a = [[1, 2, 3], [4, '5p', 6], [7, 8, 9]]`
df = pd.DataFrame(a, columns=["A", "B", "C"])
   A   B  C
0  1   2  3
1  4  5p  6
2  7   8  9

首先,使用要添加的值创建一个数组。列表理解在这里很有用,在尝试检查字符或字符串是否存在之前,请确保将列强制转换为str

b = [12 if "p" in item else 0 for item in df["B"].astype(str).values]

在这里,我们将有一个输出,其中包含要添加的值:

[0, 12, 0]

使用loc将其添加到数据帧中,添加到所需的列中:用于指示我们将要访问所有行,因为我们已经为所需列中的所有行构造了一个要添加的数组

df.loc[:, "A"] = df.loc[:, "A"] + b

检查您的输出:

    A   B  C
0   1   2  3
1  16  5p  6
2   7   8  9

如果最后一个和运算给出了一个无法连接的错误,这意味着两个加法器中的一个是str。列表不是,我们将其构造为12或0,python将其理解为数字。要解决此问题,只需将列强制转换为整数,如下所示:

df.loc[:, "A"] = df.loc[:, "A"].astype(int) + b

考虑到如果列中有非数值,此操作可能会产生其他问题

还要记住,在代码中使用列的后续操作中,要考虑该列的这种类型更改

相关问题 更多 >

    热门问题