我有2列(事先对姓名表示歉意!)“历史案例状态原始”和“历史状态开始日期”:
历史案例状态原始:包含给定案例的三种状态 历史状态开始日期:包含给定案例的该状态的日期
我想获取每个状态并按其进行过滤,然后获取相应的日期并将其添加到新列中。我可以执行一次,但是当我尝试以其他状态进行操作时,它仅适用于新列,而上一列会失败。
def closed_cases():
df_copy = df.copy()
df['Date Closed'] = np.nan
df_copy.loc[df['Historical Case Status Raw'] == "Closed", 'Date Closed'] = df['Historical Status Start Date']
return df_copy
我不确定如何对“已注册”状态进行同样的操作,然后新建一个名为“已注册日期”和“新建”的列。
在Excel中,我执行3个V型查找以使用三组独立的数据来完成此操作,但是我希望使用此格式的一组组合数据来节省时间。
编辑:我发现了一些运行缓慢的东西:
df['Date Closed'] = np.nan
df['Date Enrolled'] = np.nan
df['Date New'] = np.nan
for i in df['Historical Case Status Raw']:
if i == "Closed":
df.loc[df['Historical Case Status Raw'] == "Closed", 'Date Closed'] = df['Historical Status Start Date']
elif i == "Enrolled":
df.loc[df['Historical Case Status Raw'] == "Enrolled", 'Date Enrolled'] = df['Historical Status Start Date']
elif i == "New":
df.loc[df['Historical Case Status Raw'] == "New", 'Date New'] = df['Historical Status Start Date']
答案 0 :(得分:0)
如果您需要更快的速度,则需要更好地利用熊猫的切片功能。 如果使用正确,则很少(如果有的话)需要遍历Series中的每个值。 我没有要测试的数据,但是也许尝试一下看起来像这样的东西:
df['Date Closed'] = np.nan
df['Date Enrolled'] = np.nan
df['Date New'] = np.nan
universe = ['Closed', 'Enrolled', 'New']
for status in universe:
selection = df['Historical Case Status Raw'] == status
mySlice = df['Historical Case Status Raw'].loc[selection]
df[f"Date {status}"].loc[selection] = mySlice
注意:在循环中,每次在if块中时,您似乎都将整个系列分配给来自同一数据帧的系列切片。同样,如果不查看您的数据集,我不能确定,但这对我来说似乎是一个危险信号。
无论如何,那是我的两分钱。希望对您有所帮助:)