Pandas中一种有效的群ID处理方法

bnl4lu3b  于 2023-04-28  发布在  其他
关注(0)|答案(1)|浏览(96)
df = pd.DataFrame({
    'caseid': [1, 1, 1, 2, 2, 2, 3, 3, 3],
    'timestamp': [10, 20, 30, 10, 20, 30, 10, 20, 30] 
    'var1': [np.nan, np.nan, np.nan, 10, np.nan, 11, 12, 13, 14],
    'var2': [2., 3., 4., np.nan, 5., 6., np.nan, np.nan, np.nan]
    })

我需要为每个变量caseid找到第一个(和最后一个)有效的时间戳。即,对于var1caseid 1,它将是None,对于caseid 2,它将是10(最后一个30)。对于每个附加的var列也是如此。
有没有句柄组的id,而不循环caseid和做一个first_valid_index()的每一列,因为循环不是最有效的时候使用pandas?

3npbholx

3npbholx1#

您可以使用filter(或手动)选择所需的列,然后使用时间戳替换非NA值(使用mulwhere),最后使用groupby.aggfirst/last

m = df.filter(like='var').notna()

out = (m.mul(df['timestamp'], axis=0).where(m)
        .groupby(df['caseid']).agg(['first', 'last'])
      )

输出:

var1        var2      
       first  last first  last
caseid                        
1        NaN   NaN  10.0  30.0
2       10.0  30.0  20.0  30.0
3       10.0  30.0   NaN   NaN

中间体:

m.mul(df['timestamp'], axis=0).where(m)

   var1  var2
0   NaN  10.0
1   NaN  20.0
2   NaN  30.0
3  10.0   NaN
4   NaN  20.0
5  30.0  30.0
6  10.0   NaN
7  20.0   NaN
8  30.0   NaN

相关问题