Python Pandas - groupby условно на другом фрейме данных - PullRequest
0 голосов
/ 22 октября 2019

У меня есть два кадра данных, которые идентичны по размеру (строки / индекс даты и столбцы / фирмы). Теперь я хочу рассчитать статистику временных рядов для наблюдений в Dataframe1 на основе логики, содержащейся в Dataframe2. Например, я хочу вычислить среднее наблюдение за серию времени (Dataframe1) на основе ранга (Dataframe2)

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

Рад любому входу, так как мне не удалось найти подобную проблему!

Dataframe1
----------------------------------
            A      B      C      D      E      F       G      H             
31.12.2009  30     66     NaN    NaN    NaN    NaN     393    57     
01.01.2010  30     66     NaN    NaN    NaN    NaN     393    57   
04.01.2010  31     66     NaN    NaN    NaN    NaN     404    57     
05.01.2010  33     66     NaN    NaN    NaN    NaN     400    58    
06.01.2010  33     66     NaN    NaN    NaN    NaN     400    58   


Dataframe2
----------------------------------
            A      B      C      D      E      F       G      H            
31.12.2009  1.0    2.0    NaN    NaN    NaN    NaN     2.0    1.0     
01.01.2010  1.0    2.0    NaN    NaN    NaN    NaN     2.0    1.0   
04.01.2010  1.0    1.0    NaN    NaN    NaN    NaN     2.0    2.0     
05.01.2010  1.0    2.0    NaN    NaN    NaN    NaN     1.0    2.0    
06.01.2010  2.0    2.0    NaN    NaN    NaN    NaN     1.0    1.0  


Desired output
----------------------------------
            1.0     2.0            
31.12.2009  43.5    229.5     
01.01.2010  43.5    229.5   
04.01.2010  48.5    230.5       
05.01.2010  216.5   62.0        
06.01.2010  229.0   49.5     

Ответы [ 2 ]

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

Вы можете использовать словарное понимание для создания результирующего кадра данных. Каждый столбец генерируется с использованием where для замены значений в df1 на nan, когда конкретное значение не встречается в df2, чтобы иметь возможность использовать mean сверхось = 1 для каждого unique значение df2

df_res = pd.DataFrame({col: df1.where(df2.eq(col)).mean(1) for col in df2.stack().unique()})
print (df_res)
              1.0    2.0
31.12.2009   43.5  229.5
01.01.2010   43.5  229.5
04.01.2010   48.5  230.5
05.01.2010  216.5   62.0
06.01.2010  229.0   49.5
0 голосов
/ 22 октября 2019

Делать каждое значение по одному:

(1)

df1.where(df2 == 1).mean(axis=1)

Выход:

31.12.2009     43.5
01.01.2010     43.5
04.01.2010     48.5
05.01.2010    216.5
06.01.2010    229.0

(2)

df1.where(df2 == 2).mean(axis=1)

Вывод:

31.12.2009    229.5
01.01.2010    229.5
04.01.2010    230.5
05.01.2010     62.0
06.01.2010     49.5

Объединение в нужный вам вывод:

output = pd.DataFrame({'1':df1.where(df2 == 1).mean(axis=1),
                       '2':df1.where(df2 == 2).mean(axis=1)})
                1      2
31.12.2009   43.5  229.5
01.01.2010   43.5  229.5
04.01.2010   48.5  230.5
05.01.2010  216.5   62.0
06.01.2010  229.0   49.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...