使用指标列的累计天数

时间:2019-03-25 15:55:15

标签: python pandas dataframe

我想在Python中生成一个新变量“ Counter”,该变量计算自“虚拟”列中的最新值1起的天数。 数据按日期排序,然后按ID排序。 如果该ID以前在“虚拟”中的值不为1,则计数器应产生值-1。

原始数据看起来像下面的前三列。第四列“计数器”是所需的结果/变量,应将其添加到熊猫数据框中:

Date        ID Dummy Counter

2017-10-01   1   0   -1

2017-12-31   1   1   -1

2017-12-31   2   1   -1

2018-01-15   2   0   15

2018-01-25   1   0   25

2018-02-01   1   1   32

2018-02-02   1   0    1

谢谢!

1 个答案:

答案 0 :(得分:0)

有一个使用groupby + apply的矢量化解决方案:

将其分成两行以使其更易于理解,但仍然有些复杂:

读取您的数据:

s = '''Date        ID Dummy
2017-10-01   1   0
2017-12-31   1   1
2017-12-31   2   1
2018-01-15   2   0
2018-01-25   1   0
2018-02-01   1   1
2018-02-02   1   0'''

df = pd.DataFrame.from_csv(io.StringIO(s), sep='\s+', index_col=None)
df['Date'] = pd.to_datetime(df['Date'])

建议的解决方案:

last_valid = lambda gdf: (gdf['Date'] - gdf['Date'].where(gdf['Dummy']==1, np.nan).ffill().shift(1))
df['Counter'] = df.groupby('ID').apply(last_valid).reset_index('ID', drop=True).dt.days.fillna(-1)

输出:

    Date    ID  Dummy   Counter
0   2017-10-01  1   0   -1.0
1   2017-12-31  1   1   -1.0
2   2017-12-31  2   1   -1.0
3   2018-01-15  2   0   15.0
4   2018-01-25  1   0   25.0
5   2018-02-01  1   1   32.0
6   2018-02-02  1   0   1.0