如何从数据帧组的第一个值创建增量var?

2024-04-29 21:16:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个框架:

data=[[0,1,5],
      [0,1,6],
      [0,0,8],
      [0,0,10],
      [0,1,12],
      [0,0,14],
      [0,1,16],
      [0,1,18],    
      [1,0,2],
      [1,1,0],
      [1,0,1],
      [1,0,2]]

df = pd.DataFrame(data,columns=['KEY','COND','VAL'])

对于RES1,我想创建一个计数器变量RES,其中COND==1。的RES值 组的第一个键与VAL保持相同(我可以以某种方式使用cumcount())。你知道吗

对于RES2,我只想将缺少的值填充为 上一个值。(df.fillna(method='ffill')),我在想。。你知道吗

    KEY  COND    VAL RES1  RES2
0     0     1    5      5     5
1     0     1    6      6     6
2     0     0    8            6
3     0     0   10            6
4     0     1   12      7     7
5     0     0   14            7
6     0     1   16      8     8
7     0     1   18      9     9
8     1     0    2      2     2
9     1     1    0      3     3
10    1     0    1            3
11    1     0    2            3

我们的目标是寻找一个矢量化的解决方案,它在超过百万行的情况下是最优的。你知道吗


Tags: columnskey框架dataframedfdata方式计数器
2条回答

IIUC公司

con=(df.COND==1)|(df.index.isin(df.drop_duplicates('KEY').index))
df['res1']=df.groupby('KEY').VAL.transform('first')+
           df.groupby('KEY').COND.cumsum()[con]-
           df.groupby('KEY').COND.transform('first')
df['res2']=df.res1.ffill()
df
   Out[148]: 
    KEY  COND  VAL  res1  res2
0     0     1    5   5.0   5.0
1     0     1    6   6.0   6.0
2     0     0    8   NaN   6.0
3     0     0   10   NaN   6.0
4     0     1   12   7.0   7.0
5     0     0   14   NaN   7.0
6     0     1   16   8.0   8.0
7     0     1   18   9.0   9.0
8     1     0    2   2.0   2.0
9     1     1    0   3.0   3.0
10    1     0    1   NaN   3.0
11    1     0    2   NaN   3.0

你想要:

s = (df[df.KEY.duplicated()]          # Ignore first row in each KEY group
        .groupby('KEY').COND.cumsum() # Counter within KEY
        .add(df.groupby('KEY').VAL.transform('first')) # Add first value per KEY
        .where(df.COND.eq(1))                          # Set only where COND == 1
        .add(df.loc[~df.KEY.duplicated(), 'VAL'], fill_value=0) # Set 1st row by KEY
     )
df['RES1'] = s
df['RES2'] = df['RES1'].ffill()

    KEY  COND  VAL  RES1  RES2
0     0     1    5   5.0   5.0
1     0     1    6   6.0   6.0
2     0     0    8   NaN   6.0
3     0     0   10   NaN   6.0
4     0     1   12   7.0   7.0
5     0     0   14   NaN   7.0
6     0     1   16   8.0   8.0
7     0     1   18   9.0   9.0
8     1     0    2   2.0   2.0
9     1     1    0   3.0   3.0
10    1     0    1   NaN   3.0
11    1     0    2   NaN   3.0

相关问题 更多 >