【问题标题】:how to access value from pandas dataframe如何从熊猫数据框中访问值
【发布时间】:2016-12-09 12:44:05
【问题描述】:

此脚本通过文件夹来访问数据框的最后一列和最后一行值。我有 5 个文件,最终应该有 5 个要添加的值。但我似乎无法将它们视为价值观,即使我可以非常清楚地看到它们。代码如下:

#!/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)

这是输出:

(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

我认为我正在创建五个一一的数据框,而不是实际访问该值。我怎样才能得到这个总值,应该是 1576374。

【问题讨论】:

    标签: python-3.x pandas dataframe


    【解决方案1】:

    替换

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

    与:

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

    目前,您返回的是 pd.Series,而不是标量:

    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
    

    【讨论】:

      【解决方案2】:

      您似乎需要iatiloc 来返回标量值:

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

      示例:

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

      另一种解决方案是使用list comprehension,其中输出是列avitime 的最后一个值的列表,最后使用sum 的列表:

      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)
      

      时间安排

      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
      

      更多关于get_value的信息。

      【讨论】:

      • 完美,感谢所有回复,我尝试了添加“.value”的第一个选项,效果很好。不过,我还将探索所有其他选项,看看它们是如何工作的。
      • 是的,如果需要最快的解决方案,请使用iat - df.avitime.iat[-1]
      • 我可以添加计时
      • 查看编辑。如果不想用get_value,最快的是iat,看时间
      猜你喜欢
      • 1970-01-01
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多