首页 > 解决方案 > MultiIndex DataFrame:如何根据其他列中的值创建新列?

问题描述

我有一个不平衡的 Pandas MultiIndex DataFrame,其中每一行都存储一个firm-year观察值。样本期(变量year)范围从 2013 年到 2017 年。数据集包括变量,如果事件发生在给定 中event,则设置为变量。1year

样本数据集:

#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

到目前为止,我还没有找到任何有用的解决方案,所以任何建议都将不胜感激。谢谢!

标签: pythonpandasdataframejupyter-notebook

解决方案


我们可以groupby在您的索引(id)的第一级,然后标记所有的行eq。然后使用cumsumwhich 也转换True1and Falseto 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

推荐阅读