Получите минимальное и максимальное значения из панелей данных pandas в словаре в Python - PullRequest
1 голос
/ 04 октября 2019

У меня есть словарь (pollution) с одним ключом, который я хочу игнорировать (chemical_start_time), а все остальные ключи имеют значения, которые являются пандами.

Я хочу получить максимальное значение, присутствующее влюбой из фреймов данных и минимальное ненулевое значение.

Я считаю, что следующий код делает именно это, но я ищу наиболее эффективный или "питонический" способ сделать это

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)

Ответы [ 3 ]

2 голосов
/ 04 октября 2019

Одним из возможных решений для повышения производительности является использование numpy.ravel для массива 1d из всех значений 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
1 голос
/ 04 октября 2019

Также вы можете использовать:

max_pols.append(df.max().max())
min_pols.append(df[df > 0].min().min())
0 голосов
/ 04 октября 2019

Объедините все соответствующие кадры данных в один:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...