Pythonic способ найти максимум столбцов в df в пределах dict - PullRequest
2 голосов
/ 23 октября 2019

У меня есть словарь, который содержит несколько одинаково отформатированных фреймов данных. Я хотел бы найти максимальное значение определенного столбца во всех фреймах данных. Я мог бы выполнить итерацию по словарю, но я предполагаю, что должен быть более питонический способ сделать это.

Например, скажем, у меня есть два кадра данных (например, сокращенный, но они будут иметь больше числовых столбцов, чем просто возраст:

b = pd.DataFrame({'name': ['Ted', 'Ben', 'Frank', 'Allen'],
     'age': [22,38,26,35]})
g = pd.DataFrame({'name': ['Emily', 'Anna', 'Amy', 'Steph'],
     'age': [18,23,44,21]})

Содержится внутри dict:

dict = {'Boys': b,
     'Girls': g}

Тогда я бы предположил, что что-то вроде этого будет работать, но это не так, потому что словарь не является подписным, что я думаюЯ понимаю, я просто не уверен, что правильный способ сделать это:

Max = max(dict.values()['age'])

Есть ли лучший способ без итерации в цикле? (Если это не было ясно, ответ должен быть 44в этом примере)

Ответы [ 5 ]

4 голосов
/ 23 октября 2019

Настройка

b = pd.DataFrame({'name': ['Ted', 'Ben', 'Frank', 'Allen'],
     'age': [22,38,26,35]})
g = pd.DataFrame({'name': ['Emily', 'Anna', 'Amy', 'Steph'],
     'age': [18,23,44,21]})

d = {'B': b, 'G': g}

pd.concat и max(level=0)

pd.concat(d).age.max(level=0)

B    38
G    44
Name: age, dtype: int64

или просто max

pd.concat(d).age.max()

44

меньше панд

Это коротко, но не обязательно лучше. Я подозреваю это для больших данных.

max(map(lambda x: max(d[x].age), d))

44

Генератор

Потому что я могу

def y(d):
    for x in d:
        yield from d[x].age

max(y(d))

44
4 голосов
/ 23 октября 2019

Выполните следующие действия:

from itertools import chain
result = max(chain.from_iterable(df['age'] for df in d.values()))
print(result)

Вывод

44

Обратите внимание, что я переименовал словарь в d, поскольку вы не должны использовать встроенныйтакие имена, как dict.

3 голосов
/ 23 октября 2019

Первая версия

max(b.append(g)['age'])
Out[1]:
    44

Вторая версия

dict1 = {'Boys': b, 'Girls': g}

max([max(dict1[k]['age']) for k in dict1.keys()])
Out[2]:
    44

max([max(v['age']) for v in dict1.values()])
Out[3]:
    44
2 голосов
/ 23 октября 2019
df = pd.concat(d.values())
m = df.max()
print(m)

name    Ted
age      44
dtype: object
1 голос
/ 23 октября 2019

np.nanmax Без оси возвращает скалярный максимум.

np.nanmax([df.age.to_numpy() for df in [b,g]])  #much faster on np.array than pd.Series
#44
...