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)但我想我知道为什么-因为我有一些空白值,我需要删除。你应该为它创建一个新问题,显示新错误和发生错误的代码(以及涉及的变量)。