2017-07-14 116 views
1

只需要一点帮助即可从数据框中返回一些值。熊猫返回有条件的值


我有一个数据框(称为DF1)与一些值:

ID  X Y Distance Date 
1  1 2 2.2  01/01/2000 
2  2 3 1.8  02/02/2001 
3  3 4 1.2  03/03/2002 
4  4 5 2.7  04/04/2003 
5  5 6 3.8  05/05/2004 

目前我有这将创建一个新列码 - DF1 [ '在2K'] - 返回true如果距离在2公里以内。例如,这将是这样的:

df1['Within 2k'] = df1['distance'] <= 2 
print("df1") 

ID  X Y Distance Date   Within 2k 
1  1 2 2.2  01/01/2000 False 
2  2 3 1.8  02/02/2001 True 
3  3 4 1.2  03/03/2002 True 
4  4 5 2.7  04/04/2003 False 
5  5 6 3.8  05/05/2004 False 

我也有代码,更改ID &距离“空”如果他们不是2公里内。举例来说,这看起来像:


我的代码的目的是为了返回第一条记录(按时间顺序),其中的距离是2公里内。目前我的代码返回Date值最小的值,但是包含Null值。

我此刻的代码看起来有点像这样:

Site2km = df1.loc[df1['Date'].idxmin(),'ID'] 
Dist2km = df1.loc[df1['Date'].idxmin(),'Distance'] 

return pd.Series([Site2km, Dist2km]) 

我需要一些代码,会:

1)返回第一个ID &距离,其中距离小于2

2)如果表中的每个值都在距离2km以外,则返回字符串“Null”作为ID &距离。

回答

2

其实你不需要额外的列:

In [35]: df 
Out[35]: 
    ID X Y Distance  Date 
0 1 1 2  2.2 2000-01-01 
1 2 2 3  1.8 2001-02-02 
2 3 3 4  1.2 2002-03-03 
3 4 4 5  2.7 2003-04-04 
4 5 5 6  3.8 2004-05-05 

In [36]: df.loc[df['Distance'] <= 2].nsmallest(1, 'Date')[['ID','Distance']] 
Out[36]: 
    ID Distance 
1 2  1.8 

UPDATE:

In [47]: df 
Out[47]: 
    ID X Y Distance  Date 
0 1 1 2  2.2 2000-01-01 
1 2 2 3  1.8 2001-02-02 
2 3 3 4  1.2 2002-03-03 
3 4 4 5  2.7 2003-04-04 
4 5 5 6  3.8 2004-05-05 

In [48]: r = df.loc[df['Distance'] <= 2].nsmallest(1, 'Date')[['ID','Distance']] 

In [49]: r 
Out[49]: 
    ID Distance 
1 2  1.8 

让我们模拟的情况,当我们不2公里范围内任何两点:

In [50]: df.Distance += 10 

In [51]: r = df.loc[df['Distance'] <= 2].nsmallest(1, 'Date')[['ID','Distance']] 

In [52]: r 
Out[52]: 
Empty DataFrame 
Columns: [ID, Distance] 
Index: [] 

In [53]: if r.empty: 
    ...:  r.loc[0] = [np.nan, np.nan] 
    ...: 

In [54]: r 
Out[54]: 
    ID Distance 
0 NaN  NaN 
+0

如果df1中的每个值超出距离,我该怎么办? – christaylor

+0

@ CTaylor19,如果你有2km以内的行,你想要的输出格式是什么? – MaxU

+0

只是像“空”或什么,当我来操纵数据进一步容易被注意到 – christaylor