2016-08-23 6 views
0

Я уверен, что это очень просто, но как найти минимальное значение столбца, которое больше значения в текущем столбце? Кроме того, как найти максимальное значение столбца меньше значения в текущем столбце?Как найти минимальное значение другого столбца больше текущего столбца Pandas

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 (второй EndTime) должен быть затем 2016-03-01 14: 31: 10,790

Поэтому в основном (в псевдокоде)

ДФ [ «nexttime»] = мин (ДФ [ «STARTTIME»])> ДФА [ «»] = Конечное

бы признателен за любую помощь .. Я уверен, что это довольно легко для кого-то более опытного, чем я

ответ

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] 

Существует, вероятно, способ избежать вектора сканирования, но если производительность не является большой проблемой, это работает.

+0

Awesome .. спасибо –