【问题标题】:Get min and max values from pandas dataframes within a dictionary in Python从 Python 中的字典中的 pandas 数据帧中获取最小值和最大值
【发布时间】:2020-02-02 16:41:24
【问题描述】:

我有一本字典 (pollution),其中有一个我想忽略的键 (chemical_start_time) 和所有其他键的值都是 pandas 数据帧。

我想获得任何数据帧中存在的最大值和最小非零值。

我相信下面的代码正是这样做的,但我正在寻找最有效或“pythonic”的方式来做这件事

import numpy as np

max_pols = []
min_pols = []

for key, df in pollution.items():
    if key != 'chemical_start_time':
        max_pols.append(max(df.max()))
        min_pols.append(np.nanmin(df[df > 0].min()))

max_pol = max(max_pols)
min_pol = min(min_pols)

【问题讨论】:

    标签: python pandas numpy dataframe dictionary


    【解决方案1】:

    提高性能的一种可能的解决方案是使用 numpy.ravel 从 DataFrame 的所有值中获取一维数组,然后使用 np.min(如果可能缺少值 np.nanmin)和 np.max:

    df1 = pd.DataFrame({
             'C':[7,8,9,4,2,3],
             'D':[10,3,5,-7,10,0],
             'E':[5,-3,6,9,2,4],
    })
    
    df2 = pd.DataFrame({
             'A':[73,8,9,4,2,3],
             'D':[1,3,52,-7,1,0],
             'E':[53,-33,63,9,2,4],
    })
    pollution = {'a':df1, 'b':df2, 'chemical_start_time':pd.DataFrame([100])}
    
    max_pols = []
    min_pols = []
    
    for key, df in pollution.items():
        if key != 'chemical_start_time':
            v = df.values.ravel()
            max_pols.append(np.max(v))
            min_pols.append(np.min(v[v > 0]))
    
    max_pol = np.max(max_pols)
    min_pol = np.min(min_pols)
    
    print (max_pol)
    73
    print (min_pol)
    1
    

    【讨论】:

      【解决方案2】:

      将所有相关的数据框合二为一:

      frames = pd.concat([frame for key, frame in pollution.items() if key != 'chemical_start_time'])
      

      然后得到最大值、最小值:

      max_pol = frames.max().max()
      min_pol = frames[frames > 0].min().min()
      

      【讨论】:

      • 为什么这样会更有效率?
      • 为什么要使用 concat with axis = 0 ?那是因为您假设所有数据框都具有相同的列标签?可能导致错误或输入 NaN 值
      【解决方案3】:

      你也可以使用:

      max_pols.append(df.max().max())
      min_pols.append(df[df > 0].min().min())
      

      【讨论】:

        猜你喜欢
        • 2021-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-12
        • 1970-01-01
        • 2020-07-06
        • 2016-05-19
        相关资源
        最近更新 更多