2016-12-09 8 views
1

Dieses Skript durchsucht einen Ordner, um auf den letzten Spalten- und Zeilenwert eines Datenrahmens zuzugreifen. Ich habe 5 Dateien und sollte mit 5 Werten enden, die ich hinzufügen möchte. Aber ich kann sie nicht als Werte verstehen, obwohl ich sie sehr deutlich sehen kann. Hier ist der Code:Zugriff auf Wert aus Pandas Datenrahmen

#!/usr/bin/env python3 

import os 
import glob 
import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib import style 
style.use('ggplot') 

path = 'X:/VBOX_Data/Job_5_Shakedown/*.vbo' 

count = 0 
total_time = 0 
for vbo in glob.glob(path, recursive=True): 
    print(vbo) 
    df = pd.read_csv(vbo, 
        delim_whitespace=True, 
        encoding='iso-8859-1', 
        header=90) 
    t = df.tail(1).avitime 
    print(t) # to demonstrate output 
    total_time += t 
    count += 1 

print(total_time) 

Dies ist die Ausgabe:

(C:\Users\ifunction\AppData\Local\Continuum\Anaconda3) c:\Users\ifunction\Prog 
ramming>python test.py 
X:/VBOX_Data/Job_5_Shakedown\P1GTR__20150922103504_0001.vbo 
377 37800.0 
Name: avitime, dtype: float64 
X:/VBOX_Data/Job_5_Shakedown\P1GTR__20150922110211_0001.vbo 
230 23040.0 
Name: avitime, dtype: float64 
X:/VBOX_Data/Job_5_Shakedown\P1GTR__20150922122444_0001.vbo 
1070 135840.0 
Name: avitime, dtype: float64 
X:/VBOX_Data/Job_5_Shakedown\P1GTR__20150922135839_0001.vbo 
7579 757752.0 
Name: avitime, dtype: float64 
X:/VBOX_Data/Job_5_Shakedown\P1GTR__20150922144312_0001.vbo 
6219 621942.0 
Name: avitime, dtype: float64 
377 NaN 
Name: avitime, dtype: float64 

Ich denke, dass ich fünf eins nach dem anderen Datenrahmen erschaffe und nicht wirklich den Wert zugreifen. Wie kann ich dies als Gesamtwert erhalten, der ein Wert von 1576374.

Antwort

0

sollte es Sie für die Rückkehr Skalarwert benötigen iat oder iloc scheinen:

t += df.avitime.iat[-1] 
#t += df.avitime.iloc[-1] 

Probe:

df = pd.DataFrame({'avitime':[1,2,3]}) 

print (df) 
    avitime 
0  1 
1  2 
2  3 

t = df.avitime.iat[-1] 
print (t) 
3 

Another Lösung ist Verwendung list comprehension, wo Ausgabe ist Liste der letzten Werte der Spalte avitime, letzte Verwendung sum der Liste:

files = glob.glob(path, recursive=True) 
last_avitime = [pd.read_csv(vbo, delim_whitespace=True, encoding='iso-8859-1', header=90) 
        .avitime.iat[-1] 
       for vbo in files] 

total_time = sum(last_avitime) 
print (total_time) 

Timings:

df = pd.DataFrame({'avitime':[1,2,3]}) 
print (df) 

In [223]: %timeit (df.tail(1).avitime.values[0]) 
10000 loops, best of 3: 145 µs per loop 

In [224]: %timeit (df.iloc[-1]['avitime']) 
10000 loops, best of 3: 92.6 µs per loop 

In [225]: %timeit (df.avitime.iat[-1]) 
100000 loops, best of 3: 14.9 µs per loop 

In [226]: %timeit (df.avitime.iloc[-1]) 
10000 loops, best of 3: 21.3 µs per loop 

In [227]: %timeit (df.get_value(df.index[-1], 'avitime')) 
100000 loops, best of 3: 5.87 µs per loop 

Mehr Informationen über get_value.

+0

Perfect, danke für die Antworten, habe ich versucht, die erste Möglichkeit, '.value' hinzuzufügen, was perfekt funktionierte. Ich werde jedoch auch alle anderen Optionen untersuchen, um zu sehen, wie sie funktionieren. – iFunction

+0

Ja, wenn benötigt schnellste Lösung, verwenden Sie 'iat' -' df.avitime.iat [-1] ' – jezrael

+0

Ich kann Zeiten hinzufügen – jezrael

1

ersetzen

df.tail(1).avitime.values[0] 

mit:

df.tail(1).avitime.values[0] 
# Or 
df.iloc[-1]['avitime'] 

Derzeit sind Sie ein pd.Series Rückkehr nicht ein Skalar:

In [1]: 
import pandas as pd 
import numpy as np 

df = pd.DataFrame(np.random.rand(10,2), columns=['A','avitime']) 

In [2]: type(df.tail(1).avitime) 
Out[2]: pandas.core.series.Series 
Verwandte Themen