gpt4 book ai didi

python - 事件前后的 Pandas Dataframe 列编码 - 时间序列

转载 作者:行者123 更新时间:2023-12-04 14:01:57 25 4
gpt4 key购买 nike

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

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,事件发生后的时间从 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.Series,其中特定事件值发生一次(在你的例子中,字符串 '1'),并返回一个 pd.Series 整数范围,其中 0 与事件发生的索引相同。

例如,get_period(pd.Series(['0','0','0','1','0']))确定series的长度为5,在 index=3 处找到 '1',然后创建 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

关于python - 事件前后的 Pandas Dataframe 列编码 - 时间序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69715776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com