2016-08-01 64 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