2016-08-23 58 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

太棒了..谢谢 –

相关问题