事件前后的Pandas数据框列编码-时间序列



我有一个数据名,看起来像这样:

import pandas as pd
df = pd.DataFrame(
{'ID': ['1', '1', '1', '1', '1',
'2' , '2', '3', '3'], 
'Year': ["2012", "2013", "2014", "2015",
"2016", "2012", "2013", "2012", "2013"], 
'Event': ['0', '0', '0', '1','0', '0',
'0', '1', '0']})

我想创建一个新的列,其中的值以事件为中心,这样事件发生前的时间从0开始减少,事件发生后的时间从0开始增加。在每种情况下,只记录每个ID在事件前后的时间。有些ID没有事件,所以它们保持0,每个ID最多只能发生一次事件。

我希望结果是这样的:

out = pd.DataFrame(
{'ID': ['1', '1', '1', '1', '1', 
'2', '2', '3', '3'], 
'Year': ["2012", "2013", "2014", "2015",
"2016", "2012", "2013", "2012",
"2013"], 
'Event': ['0', '0', '0', '1','0', '0',
'0', '1', '0'], 
'Period': ['-3', '-2', '-1', '0',
'1', '0', '0', '0', '1']})

任何想法吗?提前感谢!

您可以编写一个名为get_period的自定义函数,该函数接受pd。序列,其中特定事件值只出现一次(在您的示例中是字符串'1'),并返回pd。

0

在事件发生的同一索引上的序列整数范围。例如,get_period(pd.Series(['0','0','0','1','0']))确定序列的长度为5,将'1'定位在index=3处,然后创建np.arange(5) = [0,1,2,3,4],每个值减去3,返回pd.Series([-3,-2,-1,0,1])

然后我们可以在DataFrame上执行ID组,并将get_period函数应用于Event列。

import numpy as np
import pandas as pd
def get_period(s, event_value='1'):
event_idx = np.where(s == event_value)[0]
if len(np.where(s == event_value)[0]) == 0:
return pd.Series([0]*len(s))
else:
return pd.Series(np.arange(len(s)) - event_idx)
df = pd.DataFrame({'ID': ['1', '1', '1', '1', '1', '2' , '2', '3', '3'], 'Year': ["2012", "2013", "2014", "2015", "2016", "2012", "2013", "2012", "2013"], 'Event': ['0', '0', '0', '1','0', '0', '0', '1', '0']})
df['Period'] = df.groupby("ID").Event.apply(lambda x: get_period(x)).values

结果:

ID  Year Event  Period
0  1  2012     0      -3
1  1  2013     0      -2
2  1  2014     0      -1
3  1  2015     1       0
4  1  2016     0       1
5  2  2012     0       0
6  2  2013     0       0
7  3  2012     1       0
8  3  2013     0       1

这与Derek的解决方案没有太大不同。但是它只使用熊猫。

def get_period(x):
if "1" in x["Event"].values:
out = (x.index - 
x[x["Event"].eq("1")].index[0]).values
else:
out = [0] * len(x)
x["Period"] = out
return x
df = df.groupby("ID").apply(fun)
.reset_index(drop=True)
df["Period"] = df["Period"].astype("int")

相关内容

  • 没有找到相关文章

最新更新