Pandas中优雅的数据帧操作

时间:2017-10-20 13:09:50

标签: python pandas

解决以下问题的最佳方法是什么?

我有一个数据帧df:

Group    Start Date    End Date
A         8/15/2017     8/30/2017
B         8/20/2017      NaT
C         8/07/2017     8/14/2017
A         9/07/2017      NaT

Group是一个字符串,Start DateEnd Date是日期时间

我需要对每天没有End Date的群组执行一些操作。如果这些操作要求该组的结束日期是当天,我会将NaT替换为日期。

我能想出这样做的唯一方法如下:

import pandas as pd

df_closed = df[pd.notnull(df['End_Date'])]
df_open = df[pd.isnull(df['End_Date'])]

这给了我:

df_closed

Group    Start Date    End Date
A         8/15/2017     8/30/2017
C         8/07/2017     8/14/2017

和:

df_open

Group    Start Date    End Date
B         8/20/2017      NaT
A         9/07/2017      NaT

然后我执行我的操作。比方说,如果我确定A组的结束日期应该是今天的#39; (让我们说'今天'是9/10/2017),我做

df_open.loc['A','End Date'] = 9/10/2017 

所以我有以下内容:

df_open

Group    Start Date    End Date
B         8/20/2017      NaT
A         9/07/2017    9/10/2017

在这些操作结束时,我希望我的原始数据框显示所有原始行,但更新为end dates。所以我做了以下几点:

df = df_closed.append(df_open)

给了我:

Group    Start Date    End Date
A         8/15/2017     8/30/2017
B         8/20/2017      NaT
C         8/07/2017     8/14/2017
A         9/07/2017     9/10/2017

这可以完成工作,但我必须认为有一个更少的“笨拙”。这样做的方法。

数据分析

提前致谢。

1 个答案:

答案 0 :(得分:1)

您可以在同一步骤中找到空值并将其返回以进行分配:

df.loc[df['End Date'].isnull(), 'End Date'] = <<val>>

如果您还需要找到该组:

df.loc[(df['End Date'].isnull()) & (df['Group']==<<group>>), 'End Date'] = <<val>>

通过这种方式,您可以将所有内容保存在同一数据框中,这比分离df和重新合并更简洁。