将至少一列的分组与熊猫中的一组时间戳进行比较

时间:2020-11-09 11:38:27

标签: python pandas pandas-groupby

我有以下数据框(仅提取id3的一个值):

id1 id2 id3     id4 id5 id6  status id7   max_snsr_ts               max_ts_fs    k
292 346 1041    656 578 5780    on  53  10/21/2020 23:59    10/22/2020 23:30    48
292 346 1041    657 708 7080    on  53  10/21/2020 23:59    10/22/2020 23:30    48
292 346 1041    658 579 5790    on  53  10/19/2020 23:59    10/22/2020 23:30    48
292 346 1041    657 708 5780    on  53  10/21/2020 23:59    10/23/2020 23:30    96
292 346 1041    658 579 7080    on  53  10/19/2020 23:59    10/23/2020 23:30    96
292 346 1041    656 578 5790    on  53  10/21/2020 23:59    10/23/2020 23:30    96

我正在尝试按id3分组,选择max_ts列的最小值,然后将其与id3和k每一组的max_ts_fs进行比较。根据结果​​,我想添加一个布尔值作为单独的列。

我正在尝试执行以下操作:

joined_h_raw_fs['new_col'] = np.where(joined_h_raw_fs.groupby(['id3'])['max_snsr_ts'].min().min() > joined_h_raw_fs.groupby(['id3', 'k'])['max_ts_fs'] , True, False)

期望得到:

id1 id2 id3 id4 id5 id6 status  id7 max_snsr_ts max_ts_fs   k   new_col
292 346 1041    656 578 5780    on  53  10/21/2020 23:59    10/22/2020 23:30    48  FALSE
292 346 1041    657 708 7080    on  53  10/21/2020 23:59    10/22/2020 23:30    48  FALSE
292 346 1041    658 579 5790    on  53  10/19/2020 23:59    10/22/2020 23:30    48  FALSE
292 346 1041    657 708 5780    on  53  10/21/2020 23:59    10/23/2020 23:30    96  FALSE
292 346 1041    658 579 7080    on  53  10/19/2020 23:59    10/23/2020 23:30    96  FALSE
292 346 1041    656 578 5790    on  53  10/21/2020 23:59    10/23/2020 23:30    96  FALSE

但是我遇到以下错误:

... last 1 frames repeated, from the frame below ...

pandas/_libs/tslibs/c_timestamp.pyx in pandas._libs.tslibs.c_timestamp._Timestamp.__richcmp__()

RecursionError: maximum recursion depth exceeded in comparison

当我从dplyr过渡时,我在熊猫上还不是很好。

有人可以指出我在做什么错吗?

BR

1 个答案:

答案 0 :(得分:0)

如果要比较原始列,请将GroupBy.transform用于具有与原始值相同大小的系列,并用聚合值填充原始列,在此也不需要np.where

s1 = joined_h_raw_fs.groupby(['id3'])['max_snsr_ts'].transform('min')
s2 = joined_h_raw_fs.groupby(['id3', 'k'])['max_ts_fs'].transform('min') 
joined_h_raw_fs['new_col'] = s1 > s2