我想在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
谢谢!
答案 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