2016-08-01 29 views
2

我有一个包含多列的数据框和几行包含文本数据的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-数据帧提取-all-行,其中列值最接近x = 0,1,2,3 ....按升序排列。这段代码给了我一个数据框,必须有一种方法来循环这个并附加结果数据框来获得所需的结果?

我已经试过这样:

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

L,原则上有正确的行,但它是一个混乱的列表,这需要很长的时间来执行,因为循环是不以遍历一个伟大的方式数据帧。我宁愿得到一个数据框。

我觉得我失去了一些微不足道的东西。

不知道如何发布所需的数据帧。

让说的timevalues是(从我的数据帧拍摄):

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,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是很好的。在这个应用程序中,我并不认为这是至关重要的,尽管我不确定我将如何实现这个。

如果有人需要任何附加信息,请让我知道。

+1

请发布示例DataFrame和期望的结果。 – Alex

+0

如果两个值接近相同的整数,但是没有接近下一个整数的行,您希望发生什么?例如,'0.8,1.1,1.4,2.8' - 你是否希望1.4被抓到2,尽管它接近1?会不会有值相同的值最接近两个不同的整数? – beroe

回答

1

不知道有多快重新编制将是,但你可以围绕时代来获得“进入” teger”候选人,走差异化的绝对值给自己的方式找到最接近的,那么排序的差异,然后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 
+0

Beroe:dfindex中的ElapsedTime列恰好是我想要提取的时间。现在提取Z数据框中相应列的最好方法是什么?我试图尝试一些新的数据框,包括:Z ['ElapsedTime'] = dfindex ['ElapsedTime'],我在正确的轨道上吗? – Arne

+0

只需使用您的数据框而不是'df'来执行相同的过程,并且列应该随''groupby'步骤中的所有内容一起出现。或者在开始时说'df = Z',然后尝试写入。 – beroe

+0

对不起,我的意思是提取相应行的最佳方式是什么,而不是列。 – Arne

0

考虑以下pd.Seriess

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 
相关问题