如何查找大于当前列Pandas的另一列的最小值

时间:2016-08-23 15:31:42

标签: python pandas dataframe aggregate min

我确信这很简单,但是如何找到列的最小值大于当前列中的值?另外,如何找到列的最大值小于当前列中的值?

from io import StringIO
import io

text = """Order   starttime               endtime
1       2016-03-01 14:31:10.777  2016-03-01 14:31:10.803
1       2016-03-01 14:31:10.779  2016-03-01 14:31:10.780
1       2016-03-01 14:31:10.790  2016-03-01 14:31:10.791
1       2016-03-01 14:31:10.806  2016-03-01 14:31:10.863"""

df = pd.read_csv(StringIO(text), sep='\s{2,}', engine='python', parse_dates=[1, 2])

所以..例子..    对于endtime列,我希望starttime列的最小值大于该值。

与当时终止时间相关的值2016-03-01 14:31:10.803(第一个值) 那将是2016-03-01 14:31:10.806(startdatetime的最后一个值)。

与2016-03-01 14:31:10.780(第二次结束时间)相关的值应为2016-03-01 14:31:10.790

所以基本上(在伪代码中)

df [' nexttime'] = min(df [' starttime'])> df [' endtime']

感谢任何帮助..我相信对于比我更熟练的人来说这很容易

1 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

df.endtime.apply(lambda x: min(df.starttime[df.starttime > x]) if len(df.starttime[df.starttime > x]) != 0 else np.nan)

# 0   2016-03-01 14:31:10.806
# 1   2016-03-01 14:31:10.790
# 2   2016-03-01 14:31:10.806
# 3                       NaT
# Name: endtime, dtype: datetime64[ns]

或稍微有效的方式:

def findMin(x):
    larger = df.starttime[df.starttime > x]
    if len(larger) != 0:
        return min(larger)
    else:
        return np.nan

df.endtime.apply(findMin)

# 0   2016-03-01 14:31:10.806
# 1   2016-03-01 14:31:10.790
# 2   2016-03-01 14:31:10.806
# 3                       NaT
# Name: endtime, dtype: datetime64[ns]

可能有一种方法可以避免矢量扫描,但如果性能不是一个大问题,那就可以了。