Python Pandas-以其他数据框为条件的分组依据

时间:2019-10-22 14:46:30

标签: python pandas dataframe

我有两个数据框,它们的大小相同(行/日期索引和列/校验)。我现在要做的是根据Dataframe2中包含的逻辑为Dataframe1中的观测值计算时间序列统计信息。例如,我想根据排名(Dataframe2)计算时间序列平均观察值(Dataframe1)

除了我使用第二个数据框作为条件外,某种分组过程。

很高兴能提供任何输入信息,因为我找不到类似的问题!

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 个答案:

答案 0 :(得分:4)

您可以使用字典理解来创建结果数据框。每列都是使用where替换df1中的值生成的  如果在df2中未满足特定值,请使用nan编写,以便能够对每个df2的每个mean值使用unique在轴= 1上

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

答案 1 :(得分:0)

一次执行每个值:

(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