簡體   English   中英

在兩行組中拆分給定列的差異

[英]split difference of given column within two-row groups

在R中,如果我有數據框:

a <- c(1,1,2,2,3,3,4,4);b <- c(1,0,1,0,1,0,1,0); c <- c(1.5,2.5,30,20,100,150,0.7,0.3)    
df <- data.frame(a,b,c)
> df
  a b     c
1 1 1   1.5
2 1 0   2.5
3 2 1  30.0
4 2 0  20.0
5 3 1 100.0
6 3 0 150.0
7 4 1   0.7
8 4 0   0.3

我可以按矢量化方式將差異分為幾組:

df$d <- ifelse(df$b == 1, (df$c - c(df$c[-1], NA)) / 2, (df$c - c(NA, df$c[-nrow(df)])) / 2)
> df
  a b     c     d
1 1 1   1.5  -0.5
2 1 0   2.5   0.5
3 2 1  30.0   5.0
4 2 0  20.0  -5.0
5 3 1 100.0 -25.0
6 3 0 150.0  25.0
7 4 1   0.7   0.2
8 4 0   0.3  -0.2

在大熊貓中使用相同的數據框,是否有類似的方法來實現這些結果?

df = pd.DataFrame({'a': [1,1,2,2,3,3,4,4], 'b': [1,0,1,0,1,0,1,0], 'c': [1.5,2.5,30,20,100,150,0.7,0.3]})

假設每個組只有2行,那么這僅僅是與均值之差。 我使用assign創建數據框的副本,並為該副本分配一個新列。

df.assign(d=df.groupby('a').c.transform('mean').rsub(df.c))

   a  b      c     d
0  1  1    1.5  -0.5
1  1  0    2.5   0.5
2  2  1   30.0   5.0
3  2  0   20.0  -5.0
4  3  1  100.0 -25.0
5  3  0  150.0  25.0
6  4  1    0.7   0.2
7  4  0    0.3  -0.2

您可以就地完成同一件事

df['d'] = df.groupby('a').c.transform('mean').rsub(df.c)

1.使用np.where.shift

In [1238]: df['d'] = np.where(df.b ==1, 
                              (df.c - df.c.shift(-1))/2, 
                              (df.c - df.c.shift(1))/2)

In [1239]: df
Out[1239]:
   a  b      c     d
0  1  1    1.5  -0.5
1  1  0    2.5   0.5
2  2  1   30.0   5.0
3  2  0   20.0  -5.0
4  3  1  100.0 -25.0
5  3  0  150.0  25.0
6  4  1    0.7   0.2
7  4  0    0.3  -0.2

2.或者使用df.c.diff(n)代替df.c - df.c.shift(n)

In [1244]: np.where(df.b ==1, df.c.diff(-1)/2, df.c.diff(1)/2)
Out[1244]: array([ -0.5,   0.5,   5. ,  -5. , -25. ,  25. ,   0.2,  -0.2])

對於您的R代碼,您可以更改為此。

 df%>%group_by(a)%>%dplyr::mutate(A=ifelse(b==1,(c-shift(c,1,type='lead'))/2,(c-shift(c,1,type = 'lag'))/2))
# A tibble: 8 x 4
# Groups:   a [4]
      a     b     c     A
  <dbl> <dbl> <dbl> <dbl>
1     1     1   1.5  -0.5
2     1     0   2.5   0.5
3     2     1  30.0   5.0
4     2     0  20.0  -5.0
5     3     1 100.0 -25.0
6     3     0 150.0  25.0
7     4     1   0.7   0.2
8     4     0   0.3  -0.2

對於Python,

df['d']=-df.groupby('a')['c'].diff().bfill()/2*df.b.replace({0:-1})


Out[95]: 
   a  b      c     d
0  1  1    1.5  -0.5
1  1  0    2.5   0.5
2  2  1   30.0   5.0
3  2  0   20.0  -5.0
4  3  1  100.0 -25.0
5  3  0  150.0  25.0
6  4  1    0.7   0.2
7  4  0    0.3  -0.2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM