python - MultiIndex DataFrame:如何根据其他列中的值创建新列?
问题描述
我有一个不平衡的 Pandas MultiIndex DataFrame,其中每一行都存储一个firm-year
观察值。样本期(变量year
)范围从 2013 年到 2017 年。数据集包括变量,如果事件发生在给定 中event
,则设置为变量。1
year
样本数据集:
#Create dataset
import pandas as pd
df = pd.DataFrame({'id' : [1,1,1,1,1,2,2,2,2,3,3,4,4,4,5,5,5,5],
'year' : [2013,2014,2015,2016,2017,2014,2015,2016,2017,
2016,2017,2013,2014,2015,2014,2015,2016,2017],
'event' : [1,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,1]})
df.set_index(['id', 'year'], inplace = True)
df.sort_index(inplace = True)
我想status
根据现有列创建一个新列event
,如下所示:每当事件在列中第一次发生时,列event
的值status
应该在所有后续年份(包括事件发生的年份)从0
变为。1
具有预期变量的 DataFrame status
:
event status
id year
1 2013 1 1
2014 0 1
2015 0 1
2016 0 1
2017 0 1
2 2014 0 0
2015 0 0
2016 1 1
2017 0 1
3 2016 1 1
2017 0 1
4 2013 0 0
2014 1 1
2015 0 1
5 2014 0 0
2015 0 0
2016 0 0
2017 1 1
到目前为止,我还没有找到任何有用的解决方案,所以任何建议都将不胜感激。谢谢!
解决方案
我们可以groupby
在您的索引(id)的第一级,然后标记所有的行eq
。然后使用cumsum
which 也转换True
为1
and False
to 0
:
df['status'] = df.groupby(level=0).apply(lambda x: x.eq(1).cumsum())
输出
event status
id year
1 2013 1 1
2014 0 1
2015 0 1
2016 0 1
2017 0 1
2 2014 0 0
2015 0 0
2016 1 1
2017 0 1
3 2016 1 1
2017 0 1
4 2013 0 0
2014 1 1
2015 0 1
5 2014 0 0
2015 0 0
2016 0 0
2017 1 1
推荐阅读
- algorithm - 修改输入数组的计数排序实现
- java - 将 LocalizationBundle 文件添加到可运行的 Jar、Java、Eclipse
- sql - 我想创建一个搜索功能,它会显示一张专辑中的歌曲列表
- tensorflow2.0 - 获取“ValueError:找不到匹配的函数来调用从 SavedModel 加载的函数。” 关于训练模型
- plotly-dash - dash_table 不代表真正的数据框
- python - Discord.py 如何在 message.content 中获取附件
- javascript - 使 bootstrap 下拉菜单中的 span 可点击并防止隐藏
- firebase - 在 github 操作中部署到 PR 上的 Firebase 托管失败
- python - 将上传的带有换行符的 .txt 文件存储在变量 Django 中
- c++ - MPI_Gather 我做错了什么?