pandas:在 pandas 中复制 Excel 公式

我拥有的是一个像这样的数据框:


   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))


三国纷争
浏览 143回答 1
1回答

跃然一笑

说明:继续groupby将pid相同的内容分为pid不同的组。在每个组上,应用以下操作:_ 召集diff各组。diff返回整数或NaN指示 2 个连续行之间的差异。每组的第一行没有前一行,因此diff始终返回NaN每组的第一行:df.groupby('pid').total_sum.transform(lambda x: x.diff()Out[120]:0&nbsp; &nbsp; NaN1&nbsp; &nbsp;-4.02&nbsp; &nbsp; NaN3&nbsp; &nbsp;-3.04&nbsp; &nbsp;-2.05&nbsp; &nbsp; 0.06&nbsp; &nbsp;-1.07&nbsp; &nbsp; NaN8&nbsp; &nbsp;-4.09&nbsp; &nbsp; 0.0Name: total_sum, dtype: float64_ne检查是否有任何值不是0。它返回True不0df.groupby('pid').total_sum.transform(lambda x: x.diff().ne(0))Out[121]:0&nbsp; &nbsp; &nbsp;True1&nbsp; &nbsp; &nbsp;True2&nbsp; &nbsp; &nbsp;True3&nbsp; &nbsp; &nbsp;True4&nbsp; &nbsp; &nbsp;True5&nbsp; &nbsp; False6&nbsp; &nbsp; &nbsp;True7&nbsp; &nbsp; &nbsp;True8&nbsp; &nbsp; &nbsp;True9&nbsp; &nbsp; FalseName: 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&nbsp; &nbsp; 11&nbsp; &nbsp; 22&nbsp; &nbsp; 13&nbsp; &nbsp; 24&nbsp; &nbsp; 35&nbsp; &nbsp; 36&nbsp; &nbsp; 47&nbsp; &nbsp; 18&nbsp; &nbsp; 29&nbsp; &nbsp; 2Name: total_sum, dtype: int32将所有命令链接到一行,如下所示:df['pos'] = df.groupby('pid').total_sum.transform(lambda x: x.diff().ne(0).cumsum())Out[99]:&nbsp; &nbsp;total_sum&nbsp; pid&nbsp; pos0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5&nbsp; &nbsp; 2&nbsp; &nbsp; 11&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1&nbsp; &nbsp; 2&nbsp; &nbsp; 22&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 6&nbsp; &nbsp; 7&nbsp; &nbsp; 13&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3&nbsp; &nbsp; 7&nbsp; &nbsp; 24&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1&nbsp; &nbsp; 7&nbsp; &nbsp; 35&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1&nbsp; &nbsp; 7&nbsp; &nbsp; 36&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0&nbsp; &nbsp; 7&nbsp; &nbsp; 47&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5&nbsp; &nbsp;10&nbsp; &nbsp; 18&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1&nbsp; &nbsp;10&nbsp; &nbsp; 29&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1&nbsp; &nbsp;10&nbsp; &nbsp; 2
打开App,查看更多内容
随时随地看视频慕课网APP