Python 有条件地加一个数

Python 有条件地加一个数,python,pandas,Python,Pandas,我有一个像这样的日期框: ID FirstNumberHour NewFirst LastNumberHour NewLast 1 7.0 7a 4.0 4p 2 2.0 2a 10.0 10p 3 4.0 4p

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

  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
  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
FirstNumberHour
变量是通过以下代码从
NewFirst
变量创建的:

DF['FirstNumberHourUpdate'] = pd.to_datetime(DF['NewLast']+['m'], format='%H%p').dt.hour
要将
NewFirst
NewLast
转换为24小时时间变量,我想有条件地在其对应的
First/LastNumberHour
具有“p”的时间中添加12。新变量是对象,
First/LastNumberHour
是float64。例如,输出表如下所示:

  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
  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
读到这个错误,但根据这个,它说我需要将我的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

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

基本阵列和数据帧:

a = [[1, 2, 3], [4, '5p', 6], [7, 8, 9]]`
df = pd.DataFrame(a, columns=["A", "B", "C"])
首先,使用要添加的值创建一个数组。列表理解在这里很有用,在检查是否存在字符或字符串之前,请确保将列强制转换为
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
考虑到如果列中有非数值,此操作可能会产生其他问题


另外,请记住在后续操作中将此列的类型更改考虑在内,并将其包含在代码中。

使用重复的列名不是一个好主意/做法。请注意,更新的问题以反映您的说明您可以在创建数据框的位置添加代码吗?我添加了一个代码以显示我如何创建FirstNumberHour变量。通过excel导入的所有其他变量DF=pd.read\u excel('Q:\Data Requests\GB\Schedule.xlsx',sheet\u name='Sheet2')谢谢!代码的第一部分起作用,但当我应用loc时,我得到以下错误类型错误:只能将str(而不是“int”)连接到strIt,这意味着一个加法(位于相等运算符右侧的项)是字符串,另一个是整数。由于列表是一个int,因为我们用语句
[12 if…
]``以这种方式构造它,这意味着您的列类型是str而不是int。让我更新答案来解决它。我现在得到一个错误值error:无法转换非有限值(NA或inf)但我想我知道为什么-因为我有一些空白值,我需要删除。你应该为它创建一个新问题,显示新错误和发生错误的代码(以及涉及的变量)。