2017-12-01 3 views
0

Ich habe ein Dataframe, das eine Spalte wie (0.12,0.14,0.16,0.13,0.23,0.25,0.28,0.32,0.33) hat, möchte ich eine neue Spalte haben erfassen Sie die Wertänderung nur mehr als 0,1 oder -0,1. Und andere Werte bleiben bei Änderungen gleich.Python Dataframe finde Zeilenwert, der sich alle 10 Prozent ändert

so die neue Spalte sollte wie sein (0.12,0.12,0.12,0.12,0.23,0.23,0.23,0.32,0.32)

Jeder weiß, wie man auf einfache Art und Weise zu schreiben?

Vielen Dank.

+0

Wenn sich die Werte auf 0,23 ändern, werden die Werte dahinter mit 0,23 und nicht mit 0,12 verglichen und dann mit 0,32 ..... – user7544575

Antwort

1

Nicht wirklich sicher, was Sie damit erreichen wollen, indem Sie die Daten auf beliebige Zahlen runden.

import numpy as np 

def cookdata(data): 
    #Assuming your data is sorted as per example array in your question 
    data = np.asarray(data) 
    i = 0 
    startidx = 0 
    while np.unique(data).size > np.ceil((data.max()-data.min())/0.1): 
     lastidx = startidx + np.where(data[startidx:] < np.unique(data)[0]+0.1*(i+1))[0].size 
     data[startidx:lastidx] = np.unique(data)[i] 
     startidx = lastidx 
     i += 1 
    return data 

: Sie können entweder round Funktion midpoint oder mit ceil ing/floor Funktion nach Multiplikation des Array mit 10

Was Sie versuchen jedoch zu erreichen, kann so getan werden, um zu prüfen, Dies gibt ein Dataset zurück, wie in Ihrer Frage gefragt. Ich bin sicher, es gibt bessere Möglichkeiten, es zu tun:

data = np.sort(np.random.uniform(0.12, 0.5, 10)) 
data 
array([ 0.12959374, 0.14192312, 0.21706382, 0.27638412, 0.27745105, 
     0.28516701, 0.37941334, 0.4037809 , 0.41016534, 0.48978927]) 

cookdata(data) 
array([ 0.12959374, 0.12959374, 0.12959374, 0.27638412, 0.27638412, 
     0.27638412, 0.37941334, 0.37941334, 0.37941334, 0.48978927]) 

Die Funktion gibt Array basierend auf ersten Wert zurück.

Sie können jedoch auch einfachere Operationen in Betracht ziehen, bei denen keine Rundungswerte für beliebige Datenpunkte erforderlich sind. Betrachten Sie np.round(data, decimals=1). In Ihrem Fall könnten Sie auch floor Funktion verwenden, wie in: np.floor(data/0.1)*0.1 oder wenn Sie den Anfangswert behalten möchten:

data = np.asarray(data) 
datamin = data.min() 
data = np.floor((data-datamin)/0.1)*0.1+datamin 

data 
array([ 0.12959374, 0.12959374, 0.12959374, 0.22959374, 0.22959374, 
     0.22959374, 0.32959374, 0.32959374, 0.32959374, 0.42959374]) 

Hier werden die Daten als ein Vielfaches von ersten Wert, anstatt beliebigen Wert zwischen den Vielfachen von ersten Wert .

+0

Ich löste mich danach in Excel, aber vielen Dank! – user7544575

Verwandte Themen