python - 使用第三个过滤列从另一列添加新列
问题描述
我有 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']
解决方案
如果您需要更快的东西,您需要更好地利用 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 块中时,您似乎都将整个系列分配给来自同一数据帧的系列切片。同样,如果不查看您的数据集,我无法确定,但这对我来说似乎是一个危险信号。
无论如何,这是我的两分钱。希望能帮助到你 :)
推荐阅读
- decentralized-applications - 去中心化应用程序是否在我的设备上存储了完整的底层区块链?
- input - Verilog:从模块本身内部分配给模块输入可以吗?
- angular - 如何检测波纹何时在 Angular 4+ 中完成动画?
- reactjs - React/Redux 无法更新初始状态/未定义问题
- c# - 实体框架 - 仅将数组属性的特定数组元素包含到 HTTP 响应中
- python - Jupyter Ipywidgets - 如何在重新打印输出之前清除单元格输出
- python - Pandas:计算两个数据帧之间的总百分比差异
- laravel - Laravel 黄昏断言闪烁消息
- java - AnnotationException:引用 dayHibernate 的外键...列数错误。应该是 3
- javascript - html表单