【问题标题】:Reducing Dataframe Using Weights使用权重减少数据框
【发布时间】:2018-08-21 15:44:50
【问题描述】:

我有一个以下格式的 pandas 数据框,我想减少它。

索引 CITY YEAR MONTH HOUR TEMP DP CC ASTR BSTR 2018-04-10 00:00:00 AAA 2018 4 1 20 10 0 高清光伏 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 简历 2018-04-10 01:00:00 BBB 2018 4 2 20 20 5 高清 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 ...

那么输出应该是这样的:

索引 YEAR MONTH HOUR TEMP DP CC ASTR BSTR 2018-04-10 00:00:00 2018 4 1 24 20 5 简历 2018-04-10 01:00:00 2018 4 2 14 14 6.5 高清 fd ...

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

我的实际数据中包含多个城市超过 4 年的每小时数据,因此我需要一些帮助,想出一个有效的解决方案,谢谢!

【问题讨论】:

  • 欢迎来到 Stack Overflow!您能否发布一个Minimal, Complete, and Verifiable 您的尝试示例,并具体说明您遇到的问题。
  • 嗨,我对使用 pandas 很陌生,所以我不确定从哪里开始这样的事情。我的第一个想法是做一些更“手动”的事情,方法是将数据框分解为多个城市日期框,提取每一列,将它们放入矩阵中,将矩阵的每一列乘以相应的权重,最后将一行中的每个值相加。我想知道是否有更好的方法来做到这一点?

标签: python pandas


【解决方案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 字典中的键的提供顺序与原始 dfCITY 列中城市出现的顺序相同(即按字母顺序排序)。

【讨论】:

  • 感谢您的解决方案,在添加了一个名为 Index 的列之后(我想我在帖子中不清楚 Index 表示数据框的索引),然后按 City 和 Index 对其进行排序,此解决方案有效完美!上面提到的两步我用的代码:df['Index'] = df.index df = df.sort_values(by = ['CITY', 'Index'],axis = 0)
猜你喜欢
  • 2021-12-19
  • 1970-01-01
  • 2022-01-25
  • 2013-07-05
  • 2023-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-10
相关资源
最近更新 更多