使用权重减少数据框

时间:2018-08-21 15:44:50

标签: python pandas

我有一个熊猫数据框,其格式如下。

Index                CITY   YEAR   MONTH   HOUR   TEMP   DP   CC   ASTR   BSTR
2018-04-10 00:00:00  AAA    2018   4       1      20     10   0    hd     pv
2018-04-10 01:00:00  AAA    2018   4       2      10     10   10   fg     pv
...
2018-04-10 00:00:00  BBB    2018   4       1      30     20   5    cv     er
2018-04-10 01:00:00  BBB    2018   4       2      20     20   5    hd     fd
...
2018-04-10 00:00:00  CCC    2018   4       1      20     30   10   cv     fd
2018-04-10 01:00:00  CCC    2018   4       2      10     10   5    df     ee
...

然后输出应类似于:

Index                 YEAR   MONTH   HOUR   TEMP   DP   CC   ASTR   BSTR
2018-04-10 00:00:00   2018   4       1      24     20   5    cv     er
2018-04-10 01:00:00   2018   4       2      14     14   6.5  hd     fd
...

其中TEMP,DP和CC列是每个唯一索引(索引是日期时间)的每个CITY值的加权平均值,而ASTR和BSTR只是BBB的值。 YEAR,MONTH和HOUR应该保持不变。 上面示例的权重可以通过以下字典给出: 权重= {“ AAA”:0.3,“ BBB”:0.4,“ CCC”:0.3}

我的实际数据具有多个城市超过4年的每小时数据,因此,我想为您提供有效解决方案的帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

给出以下数据框:

df = pd.DataFrame([['2018-04-10 00:00:00',  'AAA',    2018,   4,       1,      20,     10,   0,    'hd',     'pv'],
                ['2018-04-10 01:00:00',  'AAA',    2018,   4,       2,      10,     10,   10,   'fg',     'pv'],
                ['2018-04-10 00:00:00',  'BBB',    2018,   4,       1,      30,     20,   5,    'cv',     'er'],
                ['2018-04-10 01:00:00',  'BBB',    2018,   4,       2,      20,     20,   5,    'hd',     'fd'],
                ['2018-04-10 00:00:00',  'CCC',    2018,   4,       1,      20,     30,   10,   'cv',     'fd'],
                ['2018-04-10 01:00:00',  'CCC',    2018,   4,       2,      10,     10,   5,    'df',     'ee']],
                columns = ['Index','CITY','YEAR','MONTH','HOUR','TEMP','DP','CC','ASTR','BSTR'])

重量:

weights = {"AAA" : 0.3, "BBB" : 0.4, "CCC" : 0.3}

您可以执行以下操作:

w_a = lambda x: np.average(x, weights=list(weights.values()))
new = df.groupby('Index').agg({'TEMP': w_a, 'DP': w_a, 'CC': w_a})
new = new.join(df[df['CITY']=='BBB'][['Index','YEAR','MONTH','HOUR','ASTR','BSTR']].set_index('Index'), on='Index')

哪个给:

                     TEMP  DP   CC  YEAR  MONTH  HOUR ASTR BSTR
Index                                                          
2018-04-10 00:00:00    24  20  5.0  2018      4     1   cv   er
2018-04-10 01:00:00    14  14  6.5  2018      4     2   hd   fd

请注意,此解决方案假定weights词典中的键的提供顺序与城市在原始CITY的{​​{1}}列中显示的顺序相同(即,按字母顺序排序)