我有一个包含多列的数据框和一些包含文本数据的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会很好。在这个应用程序中我不认为它是那么关键,虽然我不确定如何实现此
如果有人需要任何其他信息,请告诉我。
答案 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