比较2个数据帧以获得另一个数据帧

时间:2017-10-13 02:33:42

标签: python pandas dataframe

我在数据框 df 上使用了df.describe( ),结果是:

Index  count               mean          std           min            25%           max 
ABC       6                5.14         4.63             1              2            12
CDE       6                18.6         12.5             2            7.5            15
DEF       7                30.2         32.6             1            6.5            20

另一个数据框 df2

 Index              Date        eventName    eventCount
 0            2017-08-09              ABC            24
 1            2017-08-09              CDE           140
 2            2017-08-10              CDE           150
 3            2017-08-11              DEF           200

阈值列应计算为:

例如,对于 eventName:ABC ,使用数据框 df2 中的日期:2017-08-09(每日)作为此新数据框中的新索引,偏差百分比对于日期:2017-08-09将存储在此新数据框中将是 eventCount 列中的值,表示数据框 df2 中的ABC:这是24减去数据框 df 中的 min 列,其中1表示ABC:24-1 = 23,然后除以 df2中的ABC的eventCount值 *( 100),即23/24 * 100 = 95%

生成的(新)数据框应如下所示:

     Index         eventName   eventCount        threshold       min
2017-08-09               ABC           24        Under 95%         1
2017-08-09               CDE          140      Under 98.5%         2
2017-08-10               CDE          150      Under 99.3%         2
2017-08-11               DEF          200      Under 99.5%         1 

我已经陷入困境,我该怎么办呢?

1 个答案:

答案 0 :(得分:2)

使用join(默认为left)添加新列,然后使用一些算术运算:

df = df2.set_index('Date').join(df[['min']], on='eventName', how='left')
df['threshold'] = df['eventCount'].sub(df['min']).div(df['eventCount']).mul(100).round(2)
#if need preix with %
df['threshold1'] =(df['eventCount'].sub(df['min'])
                                   .div(df['eventCount'])
                                   .mul(100)
                                   .apply("Under {0:.2f}%".format))
print (df)

           eventName  eventCount  min  threshold    threshold1
Date                                                          
2017-08-09       ABC          24    1      95.83  Under 95.83%
2017-08-09       CDE         140    2      98.57  Under 98.57%
2017-08-10       CDE         150    2      98.67  Under 98.67%
2017-08-11       DEF         200    1      99.50  Under 99.50%