将数据框中的行返回到整数列表

时间:2016-08-01 23:30:04

标签: python python-3.x pandas

我有一个包含多列的数据框和一些包含文本数据的1000行。一列包含以升序表示时间的浮点数(0,0.45,0.87,1.10等)。从这里我想构建一个新的数据帧,其中只包含这些时间值最接近整数的所有行x = 0,1,2,3 ......等等

在Stackoverflow上,我找到了一个非常相似的问题的答案,由DSM发布的答案。代码基本上是这样的,修改(希望)给出最接近x的数字,df是我的数据框。

df.loc[(df.ElapsedTime-x).abs().argsort()[:1]]

这似乎基本上做了我需要的一个x值,但我无法弄清楚如何在-entire-数据帧上迭代这个以提取列值最接近x = 0的-all-行, 1,2,3 ....按升序排列。这段代码给了我一个数据框,必须有一种方法来循环它并附加结果数据帧以获得所需的结果?

我试过这个:

L=[]
for x in np.arange(len(df)):
    L.append(df.loc[(df.ElapsedTime-x).abs().argsort()[:1]])
L   

L,原则上有正确的行,但它是一个杂乱的列表,执行需要很长时间,因为循环不是迭代数据帧的好方法。我希望得到一个数据帧作为结果。

我觉得我错过了一些微不足道的东西。

不确定如何发布所需的数据框。

让我们说时间价值(取自我的数据框):

0.00,0.03,0.58,1.59,1.71,1.96,2.21,2.33,2.46,2.58,2.7,2.83,2.95,3.07  

为0,1,2,3获取的值将为0,.58,1.96,2.95

@beroe:如果数字是0.8,1.1,1.4,2.8,在这种情况下1.1应该被抓住1和1.4应该被抓住2.如果作为一个例子,数字是0.5 1.5 2.5。虽然我认为这不太可能在我的数据中发生,但我认为将1.5作为1和2.5作为2会很好。在这个应用程序中我不认为它是那么关键,虽然我不确定如何实现此

如果有人需要任何其他信息,请告诉我。

2 个答案:

答案 0 :(得分:1)

不知道这会有多快,但你可以绕过时间来获得“整数”候选者,取差值的绝对值给自己找到最接近的方法,然后按差异排序,然后groupby整数时间只返回接近整数的行:

# setting up my fake data 
df=pd.DataFrame()
df['ElapsedTime']=pd.Series([0.5, 0.8, 1.1, 1.4, 1.8, 2.2, 3.1])

# To use your own data set, set df = Z, and start here...
df['bintime'] = df.ElapsedTime.round()
df['d'] = abs(df.ElapsedTime - df.bintime)
dfindex = df.sort('d').groupby('bintime').first()

对于上面定义的假时间系列,dfindex的内容是:

         ElapsedTime    d
bintime                  
0                0.5  0.5
1                1.1  0.1
2                1.8  0.2
3                3.1  0.1

答案 1 :(得分:0)

考虑以下pd.Series s

s = pd.Series(np.arange(5000), np.random.rand(5000) * 100).sort_index()

s.head()

0.002587    3007
0.003418    4332
0.060767    2045
0.125182    3179
0.134487    4614
dtype: int64

使所有整数最接近:

idx = (s.index // 1).unique()

然后使用method='nearest'

重新索引
s.reindex(idx, method='nearest').head()

0.0    3912
1.0    3617
2.0    2574
3.0     811
4.0     932
dtype: int64