2016-10-12 3 views
2

У меня есть указатель, содержащий 3 кадра данных одинаковой формы. Я хотел бы создать:.python pandas - можно сравнить 3 dfs одной и той же формы, используя где (max())? это проблема маскировки?

  1. 4-й dataframe, который идентифицирует наибольшее значение из исходного 3 в каждой координате - так выпо [ 'четыре'] IX [0, 'A'] = MAX (DIC [» ix [0, 'A'], dic ['two']. ix [0, 'A'], dic ['three']. ix [0, 'A'])
  2. a пятые со вторым по величине значения

    dic = {} 
    for i in ['one','two','three']: 
        dic[i] = pd.DataFrame(np.random.randint(0,100,size=(10,3)), columns=list('ABC')) 
    

Я не могу понять, как использовать .гд(), чтобы сравнить оригинал 3 ДХ. Для окончательного набора данных петля будет неэффективной.

ответ

3

Рассмотрим dictdfs который является словарь pd.DataFrame с

import pandas as pd 
import numpy as np 

np.random.seed([3,1415]) 
dfs = dict(
    one=pd.DataFrame(np.random.randint(1, 10, (5, 5))), 
    two=pd.DataFrame(np.random.randint(1, 10, (5, 5))), 
    three=pd.DataFrame(np.random.randint(1, 10, (5, 5))), 
) 

лучший способ справиться с этим с pd.Panel объектом, который является более одномерным объектом аналогично pd.DataFrame.

p = pd.Panel(dfs) 

то ответы, которые вам нужны очень straighforward

макс
p.max(axis='items') или p.max(0)

предпоследний
p.apply(lambda x: np.sort(x)[-2], axis=0)

+0

отличный ответ, спасибо pi. находите ли вы какие-либо различия в производительности между работой с панелями против dicts dfs? – MJS

+0

@ MJS да! Работа с панелями будет быстрее. Вы можете ускорить это, работая на базовых массивах numpy. Но я оставлю это для вас, чтобы понять. – piRSquared

0

1-й вопрос легко ответить, вы можете использовать функцию numpy.maximum() найти поэлементно максимальное значение в каждой ячейке, через несколько dataframes

dic ['four'] = pd.DataFrame(np.maximum(dic['one'].values,dic['two'].values,dic['three'].values),columns = list('ABC')) 

 Смежные вопросы

  • Нет связанных вопросов^_^