我确信这很简单,但是如何找到列的最小值大于当前列中的值?另外,如何找到列的最大值小于当前列中的值?
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']
感谢任何帮助..我相信对于比我更熟练的人来说这很容易
答案 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]
可能有一种方法可以避免矢量扫描,但如果性能不是一个大问题,那就可以了。