首页 > 解决方案 > 使用第三个过滤列从另一列添加新列

问题描述

我有 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']

标签: pythonpandasnumpy

解决方案


如果您需要更快的东西,您需要更好地利用 pandas 的切片功能。如果您正确使用它,您很少(如果有的话)需要遍历系列中的每个值。我没有要测试的数据,但也许尝试一下看起来像这样的东西:

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 块中时,您似乎都将整个系列分配给来自同一数据帧的系列切片。同样,如果不查看您的数据集,我无法确定,但这对我来说似乎是一个危险信号。

无论如何,这是我的两分钱。希望能帮助到你 :)


推荐阅读