2016-08-23 75 views
0

我確定這很容易,但是如何找到大於當前列中值的列的最小值?另外,如何找到列的最大值小於當前列中的值?如何找到大於當前列的另一列的最小值大熊貓

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 2016-03-01 14:31:10.803(第一個值) 相關的值將是2016-03-01 14:31:10.806(startdatetime的最後一個值)。

與2016年3月1日14相關聯的值:31:然後10.780(第二結束時間)應爲2016年3月1日14:31:10.790

所以基本上(在僞代碼)

DF [「nexttime」] = MIN(DF [「開始時間」])> DF [「結束時間」]

希望得到任何幫助。我敢肯定,這是很容易的人更熟練比我

回答

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

太棒了..謝謝 –

相關問題