繁体   English   中英

根据列值提取 Pandas Dataframe 中的下一行

[英]Extracting next rows in Pandas Dataframe based on column values

假设我有以下 Dataframe

  final  raw  act    wc             Start            Finish
   abc  xyz   30    M5  17-01-2022 06:00  14-07-2031 02:36
   abc  xyz   40    F4  17-01-2022 06:00  14-07-2031 02:36
   abc  xyz   50    F6  17-01-2022 06:00  14-07-2031 02:36
   abc  xyz   60    F8  17-01-2022 06:00  14-07-2031 02:36
   abc  pqr   40  M14S  17-01-2022 06:00  18-01-2026 17:21
   abc  pqr   50   M12  17-01-2022 06:00  18-01-2026 17:21
   abc  pqr   60  M14S  17-01-2022 06:00  18-01-2026 17:21
   abc  pqr   20    F3  17-01-2022 06:00  14-07-2031 02:36
   abc  pqr   40    F4  17-01-2022 06:00  14-07-2031 02:36
   abc  pqr   50    F6  17-01-2022 06:00  14-07-2031 02:36

我想从这里取两行,一是

 abc  xyz   50  F6  17-01-2022 06:00  14-07-2031 02:36

另一个是

abc  pqr   50    F6  17-01-2022 06:00  14-07-2031 02:36

逻辑是,对于每个raw ,选择wcF3、F4行为最大的下一行。 在这里xyzF4在那里,所以下一行也是pqrF3, F4都在那里,但最大行为是 40。

我使用pd.shift()

dft = dfUno.loc[dfUno['wc'].shift().eq('F4')]

但我想以更通用的方式查看它,可能是使用iterrows()进行提取。 就像,我的代码仅适用于F4 我也想提取用于上述F4/F3的 dataframe。

对此的预期结果:

 final  raw  act    wc             Start            Finish
   abc  xyz   30    M5  17-01-2022 06:00  14-07-2031 02:36
   abc  xyz   40    F4  17-01-2022 06:00  14-07-2031 02:36
   abc  pqr   40  M14S  17-01-2022 06:00  18-01-2026 17:21
   abc  pqr   50   M12  17-01-2022 06:00  18-01-2026 17:21
   abc  pqr   60  M14S  17-01-2022 06:00  18-01-2026 17:21
   abc  pqr   20    F3  17-01-2022 06:00  14-07-2031 02:36
   abc  pqr   40    F4  17-01-2022 06:00  14-07-2031 02:36

请提出一些建议,如何去做。

您可以首先对框架进行子集化,使其仅具有wc等于"F3""F4"的行。 然后按raw列分组以查看每组的哪个索引给出了最大act 然后用它们索引原始帧:

>>> df.loc[df[df.wc.isin(["F3", "F4"])].groupby("raw", sort=False).act.idxmax()]

  final  raw  act  wc             Start            Finish
1   abc  xyz   40  F4  17-01-2022 06:00  14-07-2031 02:36
8   abc  pqr   40  F4  17-01-2022 06:00  14-07-2031 02:36

IE,

>>> df.wc.isin(["F3", "F4"]) 
0    False
1     True
2    False
3    False
4    False
5    False
6    False
7     True
8     True
9    False
Name: wc, dtype: bool

>>> subset = df[df.wc.isin(["F3", "F4"])]
>>> subset
  final  raw  act  wc             Start            Finish
1   abc  xyz   40  F4  17-01-2022 06:00  14-07-2031 02:36
7   abc  pqr   20  F3  17-01-2022 06:00  14-07-2031 02:36
8   abc  pqr   40  F4  17-01-2022 06:00  14-07-2031 02:36

>>> idxmax_act_per_raw = subset.groupby("raw", sort=False).act.idxmax()
>>> idxmax_act_per_raw 
raw
xyz    1
pqr    8
Name: act, dtype: int64

>>> df.loc[idxmax_act_per_raw]
  final  raw  act  wc             Start            Finish
1   abc  xyz   40  F4  17-01-2022 06:00  14-07-2031 02:36
8   abc  pqr   40  F4  17-01-2022 06:00  14-07-2031 02:36

groupbysort=False确保raw在分组时不排序,否则我们会在最后得到带有"pqr"的行,因为"pqr" < "xyz" 。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM