为了账号安全,请及时绑定邮箱和手机立即绑定

pandas:在 pandas 中复制 Excel 公式

pandas:在 pandas 中复制 Excel 公式

PHP
三国纷争 2023-11-09 20:14:10
我拥有的是一个像这样的数据框:   total_sum  pid   5          2   1          2   6          7   3          7   1          7   1          7   0          7   5         10   1         10   1         10我想要的是另一列,pos例如:   total_sum  pid    pos   5          2      1   1          2      2    6          7      1   3          7      2   1          7      3   1          7      3   0          7      4   5         10      1   1         10      2   1         10      2背后的逻辑是:posnew 的初始pid值为1。如果pid没有更改但发生total_sum更改,则 的值pos将增加 1(例如前两行),否则 的值pos是先前的值(例如最后两行)。我尝试过的: df['pos'] = 1 df['pos'] = np.where(((df.pid.diff(-1)) == 0 & (df.total_sum.diff(-1) == 0)),                                                     df.pos, (np.where(df.total_sum.diff(1) < 1, df.pos + 1, df.pos )))目前,我正在 Excel 工作表中执行此操作,首先在 的第一列中手动写入 1 pos,然后在 的第二个单元格中写入公式pos:=IF(A3<>A2,1,IF(B3=B2,C2,C2+1))
查看完整描述

1 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

说明:


继续groupby将pid相同的内容分为pid不同的组。在每个组上,应用以下操作:


_ 召集diff各组。diff返回整数或NaN指示 2 个连续行之间的差异。每组的第一行没有前一行,因此diff始终返回NaN每组的第一行:


df.groupby('pid').total_sum.transform(lambda x: x.diff()


Out[120]:

0    NaN

1   -4.0

2    NaN

3   -3.0

4   -2.0

5    0.0

6   -1.0

7    NaN

8   -4.0

9    0.0

Name: total_sum, dtype: float64

_ne检查是否有任何值不是0。它返回True不0


df.groupby('pid').total_sum.transform(lambda x: x.diff().ne(0))


Out[121]:

0     True

1     True

2     True

3     True

4     True

5    False

6     True

7     True

8     True

9    False

Name: total_sum, dtype: bool

_cumsum是逐行相加的累积和。在 Python 中,True被解释为1并被False解释为0。每组的第一个总是True,因此cumsum总是从1每行开始并将其相加以获得所需的输出。


df.groupby('pid').total_sum.transform(lambda x: x.diff().ne(0).cumsum())


Out[122]:

0    1

1    2

2    1

3    2

4    3

5    3

6    4

7    1

8    2

9    2

Name: total_sum, dtype: int32

将所有命令链接到一行,如下所示:


df['pos'] = df.groupby('pid').total_sum.transform(lambda x: x.diff().ne(0).cumsum())


Out[99]:

   total_sum  pid  pos

0          5    2    1

1          1    2    2

2          6    7    1

3          3    7    2

4          1    7    3

5          1    7    3

6          0    7    4

7          5   10    1

8          1   10    2

9          1   10    2


查看完整回答
反对 回复 2023-11-09
  • 1 回答
  • 0 关注
  • 135 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信