【问题标题】:How to get average values from specific value type?如何从特定值类型中获取平均值?
【发布时间】:2021-12-24 22:12:29
【问题描述】:

我有一个数据框:

id            value
a       0:3,1:0,2:0,3:4
a       0:0,1:0,2:2,3:0
a       0:0,1:5,2:4,3:0

如何获取列值中键的平均值?

例如对于0:3,1:0,2:0,3:4,它必须是(0+0+0+3+3+3+3)/7 = 1.71

对于0:0,1:0,2:2,3:0,它必须是2+2/2=2

对于0:0,1:5,2:4,3:0,它必须是(1+1+1+1+1+2+2+2+2)/9 = 1.44

所以想要的结果是:

id            value
a              1.71
a              1.66
a              1.44

如何做到这一点?它不是字典值,所以我不太明白如何在这里使用键和值进行操作

【问题讨论】:

  • 到目前为止你有什么尝试?
  • @YevhenKuzmovych 我试着用 json.loads() 把它变成字典。但出现此错误: JSONDecodeError: Extra data: line 1 column 2 (char 1)
  • 计算有误

标签: python python-3.x dataframe function


【解决方案1】:

你可以使用:

g = (df.join(df['value'].str.split(',')
                        .explode()
                        .str.split(':', expand=True)
             .astype(int)
            )
       .assign(value=lambda d: d[0]*d[1])
       .set_index('id', append=True)
       .groupby(level=[0,1])
      )
g['value'].sum()/g[1].sum()

输出:

   id
0  a       1.7143
1  a       2.0000
2  a       1.4444

工作原理:

1- 拆分值并创建新列
(df.join(df['value'].str.split(',')
                        .explode()
                        .str.split(':', expand=True)
             .astype(int)
            )
   .assign(value=lambda d: d[0]*d[1])
   .set_index('id', append=True)
)
      value  0  1
  id             
0 a       0  0  3
  a       0  1  0
  a       0  2  0
  a      12  3  4
1 a       0  0  0
  a       0  1  0
  a       4  2  2
  a       0  3  0
2 a       0  0  0
  a       5  1  5
  a       8  2  4
  a       0  3  0
2-计算值的总和和权重的总和以获得平均值
>>> g['value'].sum()
   id
0  a     12
1  a      4
2  a     13

>>> g[1].sum()
   id
0  a     7
1  a     2
2  a     9 

>>> g['value'].sum()/g[1].sum()
   id
0  a       1.7143
1  a       2.0000
2  a       1.4444

【讨论】:

  • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
  • @YevhenKuzmovych 我来了,但给我一分钟;)我已经在修复问题中的错误
  • 除了缺少解释,这看起来很复杂。您不必在“一个”行中解决所有问题
  • @YevhenKuzmovych 请随时提供解决方案,如果您不介意,我会按照我喜欢的方式编写代码;)
  • @skulldoger 请提供df.to_dict() 的输出(将其添加到您的问题中)
猜你喜欢
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 2021-02-01
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多